【问题标题】:Regex throwing exception in JAVA, working in PHP正则表达式在 JAVA 中抛出异常,在 PHP 中工作
【发布时间】:2016-08-01 07:46:36
【问题描述】:

我有一个有效的 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 某处。

在这方面需要帮助。

【问题讨论】:

  • Java regex 不支持递归和子程序调用,(?&amp;A) 无效。只需替换为 A 组模式即可。并且不要忘记使用双反斜杠来转义 Java 字符串文字中的正则表达式元字符。见"(\\w+\\(\\?*\\w+(?:,\\?*\\w+)?\\))(,\\w+\\(\\?*\\w+(?:,\\?*\\w+)?\\))*"
  • 我用你的正则表达式替换了我的正则表达式,它没有抛出异常但也没有找到模式。不管我如何获得领先,让我解决它。感谢您的时间和精力。
  • 我删除了内部捕获组,您需要它们吗?把它们放在原来的地方。
  • 我没有让它工作,我将它分成块,并尝试使用两个与 java 兼容的正则表达式来找到它
  • ideone.com/CET4bS - 它满足你的需要吗?

标签: java regex pattern-matching


【解决方案1】:

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

唯一的出路是在最后重复(?&lt;A&gt;)组模式,见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。我删除了内部捕获组,因为很可能您无论如何都不会使用它们。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 2020-11-05
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多