给定一个包含一定数量的方括号和其他字符的字符串,我想找到所有右方括号,前面有一个左方括号和一些字母。
例如,如果字符串是
] [abc] [123] abc]
我只想找到第二个右括号。
以下正则表达式
(?
会找到第二个右括号,也是最后一个:
] [abc]【123】abc]
由于我只想找到第一个,因此我对正则表达式进行了明显的更改......
(?<=\[[a-z]+)\]
...我得到“后视组在索引 11 附近没有明显的最大长度。”
\[
只是一个字符,所以看起来明显的最大长度应该是 1 + 无论第一个表达式中后向组的明显最大长度是什么。是什么赋予了?
ETA:它并不特定于左括号。
(?
给了我同样的错误。 (嗯,在索引 12 处。)
\[ 只是一个字符,因此看起来明显的最大长度应该是 1 + 无论第一个表达式中后向组的明显最大长度是什么。是什么赋予了?
这才是重点,“无论第一个表达式中后视组的明显最大长度是多少”, is not明显的。拳头的规则是你不能使用+
or *
里面有一个向后看。这不仅适用于 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
EDIT
如果你有兴趣更换这样的]
的,你可以这样做:
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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)