小编典典

为什么此正则表达式中的后向表达式没有“明显的最大长度”?

java

给定一个包含一定数量的方括号和其他字符的字符串,我想找到所有以方括号开头并带有一定数量字母的方括号。例如,如果字符串是

] [abc] [123] abc]

我只想找到第二个结束括号。

以下正则表达式

(?<= [az] +)\]

会找到第二个结束括号,也是最后一个:

] [abc ] [123] abc ]

由于我只想查找第一个,因此我对正则表达式进行了明显的更改。

(?<= \ [[ [az] +)\]

…并且我得到“ Look-behind组在索引11附近没有明显的最大长度”。

\[只是一个字符,因此无论第一个表达式中后向组的明显最大长度是多少,似乎最大长度应该为1 +。是什么赋予了?


预计 到达时间 不只 限于左 括号。

(?<= a [bz] +)\]

给我同样的错误。(好吧,在索引12。)


阅读 204

收藏
2020-11-30

共1个答案

小编典典

\ [只是一个字符,因此无论第一个表达式中后向组的明显最大长度是多少,似乎最大长度应该是1 +。是什么赋予了?

关键是, “无论第一个表达式中后向组的明显最大长度是多少” ,这 都不是
显而易见的。拳头的规则是,你不能使用+或者*一个向后看的内部。这不仅对于Java的正则表达式引擎如此,而且对于更多PCRE风格的引擎(甚至Perl的(v5.10)引擎!)也是如此。

您可以提前进行以下操作:

Pattern p = Pattern.compile("(?=(\\[[a-z]+]))");
Matcher m = p.matcher("] [abc] [123] abc]");
while(m.find()) {
  System.out.println("Found a ']' before index: " + m.end(1));
}

(即,可以使用前瞻(!)内的捕获组来获取end(...)该组中的捕获组)

将打印:

在索引前找到一个“]”:7

编辑

而且,如果您有兴趣替换此类],可以执行以下操作:

String s = "] [abc] [123] abc] [foo] bar]";
System.out.println(s);
System.out.println(s.replaceAll("(\\[[a-z]+)]", "$1_"));

它将打印:

] [abc] [123] abc] [foo]条]
] [abc_ [123] abc] [foo_ bar]
2020-11-30