Java中索引附近的未知后视组

时间:2014-06-17 05:18:15

标签: java regex

这是一个失败的代码的极简主义样本:

String al = "(?<xyz>chicago)";
Pattern p = Pattern.compile(al, Pattern.CASE_INSENSITIVE);

我得到了:

java.util.regex.PatternSyntaxException: Unknown look-behind group near index 13
(?<xyz>chicago)
             ^
    at java.util.regex.Pattern.error(Pattern.java:1713)
    at java.util.regex.Pattern.group0(Pattern.java:2505)
    at java.util.regex.Pattern.sequence(Pattern.java:1806)
    at java.util.regex.Pattern.expr(Pattern.java:1752)
    at java.util.regex.Pattern.compile(Pattern.java:1460)
    at java.util.regex.Pattern.<init>(Pattern.java:1133)
    at java.util.regex.Pattern.compile(Pattern.java:847)
         :
         :

我缺少/忽视什么?我正在使用java 1.7开发Eclipse。

2 个答案:

答案 0 :(得分:4)

我无法使用Java 1.7或1.8重现此异常。这个正则表达式在两个平台上编译都很好。

我(由@ zx81指出)(?<xyz>...)是命名组捕获的Java正则表达式语法。所以我检查了Javadoc,并且:

  • Java 1.8
  • 支持该语法
  • Java 1.7
  • 支持该语法
  • Java 1.6中支持语法

所以我的理论是你实际上用Java 1.6(或更早版本的)JRE执行你的代码,这就是把它当作一种不为人知的看法。

答案 1 :(得分:0)

编译器的

answer表示正则表达式语法无效:

  • (?P<name>regex)-是命名组的语法
  • (?<=regex) / (?<!regex)是正向/负向后视

如果未转义,则'('和'?'都是特殊字符,并且没有任何意义,因此需要非任意连续,例如

  • (?i)-不区分大小写的匹配
  • (?s)-单行模式
  • (?:regex)-非捕获组等