正则表达式在JAVA中抛出异常,在PHP中工作

时间:2016-08-01 07:46:37

标签: java regex pattern-matching

我有一个正常的PHP正则表达式

\w+[\(](\?*)\w+[\,](\?*)\w+[\)]

此处提供了其工作链接https://regex101.com/r/tB2pS3/1

我可以按照预期在PHP中使用它但是当我在JAVA中使用它时,它给了我例外

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 37 (?<A>\w+\((\?*)\w+(,(\?*)\w+)?\))(,(?&A))*

我不熟悉正则表达式和java,但我得到的是,在互联网上阅读一些相关问题之后可能存在一些支持问题,因为正则表达式工作正常并且它在PHP中给出了准确的结果,问题出在JAVA在哪里。

在这方面需要帮助。

1 个答案:

答案 0 :(得分:4)

Java regex不支持递归子程序调用,此处(?&A)无效。另外,不要忘记使用双反斜杠来转义Java字符串文字中的正则表达式元字符。

唯一的出路是在最后重复(?<A>)组模式,请参阅this demo

(?<A>
  \w+\(
  \?*\w+
  (?:,\?*\w+)?
  \)
)
(,
  \w+\(
  \?*\w+
  (?:,\?*\w+)?
  \)
)*

我建议在这里使用块构建方法,首先定义块,然后构建动态模式:

String block = "\\w+\\(\\?*\\w+(?:,\\?*\\w+)?\\)";
String pat = "(" + block + ")(," + block + ")*";
List<String> strs = Arrays.asList("a(b)", "a(?v)", "a(b),c(?c,a)");
for (String str : strs) {
    Matcher m = Pattern.compile(pat).matcher(str);
    while (m.find()) {
        System.out.println(m.group(0));
    }
}

请参阅Java demo。我删除了内部捕获组,因为大多数情况下你可能不会使用它们。