【问题标题】:Java regex pattern too long? [closed]Java 正则表达式模式太长? [关闭]
【发布时间】:2017-09-05 12:14:00
【问题描述】:

我有这个比平时长一点的正则表达式。我尝试在文本文档中捕获一些值。

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimate\\s.*\\n*\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s*((\\d+|<)\\.\\d+)\\s+

它在 regexr.com link 上运行良好

但在 Java 中只有这部分有效

\\n*.*(k\\s=\\s\\d)(.|\\n)*?estimat

只要我添加缺少的“e”,它就会停止工作。

现在我忽略了一些组被错误地填充。

出了什么问题?

【问题讨论】:

  • 听起来很奇怪,你能发布一个重现它的 Java 代码的 sn-p 吗?
  • 观察输入字符串。
  • 在您的情况下,我将首先使用正则表达式完全拆分文本,然后使用第二个或更多正则表达式分析您感兴趣的值。使用单个正则表达式做所有事情是 a$$ 的痛苦
  • 永远不要使用(.|\\n)*?。替换为(?s:.*?)。在正则表达式中,应该跨行匹配的 .*? 应该替换为 [^]*?(因为该站点使用 JS 正则表达式风格)。
  • @SebastianBauer 请考虑在下面接受/支持我的回答。

标签: java regex


【解决方案1】:

(.|\\n)*? 使正则表达式引擎执行过多的冗余回溯步骤。您需要用(?s:.*?) 替换模式中的所有此类部分,(?s:.*?) 是一个匹配任何 0+ 字符(包括换行字符)的修饰符组。由于没有交替,所以这里没有多余的回溯。

请注意,在 JavaScript 中(因为您正在 regexr.com 上测试仅支持 JavaScript 正则表达式风格的模式),应将 (.|\n)*? 替换为 [^]*?[\s\S]*?,因为它的正则表达式引擎不支持内联修饰符完全没有。

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多