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

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

] [abc] [123] abc]

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

以下正则表达式

(?<= [AZ] +)\]

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

] [abc ] [123] abc ]

由于我只想找到第一个,我对正则表达式进行了明显的改变……

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

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

\[只是一个字符,所以看起来明显的最大长度应该是1 +,无论第一个表达式中后视组的明显最大长度是多少。 是什么赋予了?


ETA:它并不特定于开放式支架。

(?<= A [BZ] +)\]

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

\ [只是一个字符,所以看起来明显的最大长度应该是1 +,无论第一个表达式中后视组的明显最大长度是多少。 是什么赋予了?

这就是重点, “无论第一个表达式中后视组的明显最大长度是什么”都不明显。 一个拳头的规则是你不能在后面使用+* 。 这不仅适用于Java的正则表达式引擎,还适用于更多PCRE风格的引擎(甚至是Perl(v5.10)引擎!)。

但是,您可以通过预测来执行此操作:

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

(即前方outlook中的捕获组(!),可用于获取组的end(...)

将打印:

 在索引前找到']':7 

编辑

如果你有兴趣替换这些] ,你可以这样做:

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

将打印:

  ] [abc] [123] abc] [foo] bar]
 ] [abc_ [123] abc] [foo_ bar] 
  "^[^\[]*\[[^\]]*?(\])" 

小组(1)你想要什么?