我有一个正常的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在哪里。
在这方面需要帮助。答案 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。我删除了内部捕获组,因为大多数情况下你可能不会使用它们。