Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个正则表达式中的look-behind表达式没有一个";明显的最大长度“;?_Java_Regex - Fatal编程技术网

Java 为什么这个正则表达式中的look-behind表达式没有一个";明显的最大长度“;?

Java 为什么这个正则表达式中的look-behind表达式没有一个";明显的最大长度“;?,java,regex,Java,Regex,给定一个包含一定数量方括号和其他字符的字符串,我希望找到所有结束方括号前都有一个开始方括号和一定数量的字母。 例如,如果字符串为 ][美国广播公司][123]美国广播公司] 我只想找到第二个结束括号 下面的正则表达式 (?)? \[只有一个字符,所以看起来明显的最大长度应该是1+,不管第一个表达式中的look behind组的明显最大长度是多少。给出了什么 这就是重点,“无论第一个表达式中的lookbehind组的最大长度是多少”,这一点并不明显。首要原则是不能在lookbehind中使用+或*

给定一个包含一定数量方括号和其他字符的字符串,我希望找到所有结束方括号前都有一个开始方括号和一定数量的字母。 例如,如果字符串为

][美国广播公司][123]美国广播公司]

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

下面的正则表达式

(?)? \[只有一个字符,所以看起来明显的最大长度应该是1+,不管第一个表达式中的look behind组的明显最大长度是多少。给出了什么

这就是重点,“无论第一个表达式中的lookbehind组的最大长度是多少”,这一点并不明显。首要原则是不能在lookbehind中使用
+
*
。这不仅适用于Java的正则表达式引擎,也适用于更多PCRE风格的引擎(甚至是Perl的(v5.10)引擎!)

但是,您可以使用look aheads执行此操作:

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));
}
(即,前瞻(!)中的捕获组,可用于获取组的
结束(…)

将打印:

Found a ']' before index: 7 ] [abc] [123] abc] [foo] bar] ] [abc_ [123] abc] [foo_ bar] 将打印:

Found a ']' before index: 7 ] [abc] [123] abc] [foo] bar] ] [abc_ [123] abc] [foo_ bar] ][abc][123]abc][foo]bar] ][abc_uu[123]abc][foo_uu-bar]
组(1)是您想要的吗?

@David,可能是正则表达式API中反复出现的错误(请参见:和),那么我是否正确地认为没有一个正则表达式可以让我只得到括号——例如,我可以在
String.replace()
中使用的东西?不,您是不对的:)。请参阅我的编辑。(注意,
replace(…)
不使用regex,它的
replaceAll(…)
replaceFirst(…)
)对不起,我的意思是说
replaceAll()