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

时间:2011-10-06 19:23:53

标签: java regex

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

  

] [abc] [123] abc]

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

以下正则表达式

  

(小于?= [A-Z] +)\]

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

  

] [abc ] [123] abc ]

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

  

(小于?= \ [ [A-Z] +)\]

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

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


ETA:这不是特定于左括号。

  

(小于?=α[B-Z] +)\]

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

2 个答案:

答案 0 :(得分:3)

  

\ [只是一个字符,所以看起来明显的最大长度应该是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(...)

将打印:

Found a ']' before index: 7

修改

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

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

将打印:

] [abc] [123] abc] [foo] bar]
] [abc_ [123] abc] [foo_ bar]

答案 1 :(得分:0)

 "^[^\[]*\[[^\]]*?(\])"

是你想要的组(1)吗?