【问题标题】:Possible regex backtracking issues?可能的正则表达式回溯问题?
【发布时间】:2014-04-26 17:56:17
【问题描述】:

我有以下正则表达式和输入:

http://regex101.com/r/cI3fG4

基本上,我想匹配最后一个“哟”并将所有内容保持为绿色(组(1))。

这适用于小文件/输入。

但是,如果我在 java 中针对一个非常大 (100k) 的文件运行它,该文件没有模式匹配(只有一堆文本 - war&peace sn-p),它可能需要 10 秒以上才能从尝试返回找到匹配。我假设正则表达式存在回溯问题(特别是 (.*) group(1) 匹配)。

我可以做些什么来防止每个用例的回溯并加速这个正则表达式以满足上述要求?

-- Java 代码--

    // Works fine for this small snippet but when run against 100k large input
    // as described above some serious perf issues start happening.  

    String text = "Hi\n\nyo keep this here\n\nKeep this here\n\nyo\nkey match line here cut me:\n\nAll of this here should be deleted";
    System.out.println(text);
    Pattern PATTERN = Pattern.compile("^(.*)((\\byo\\b.*?(cut me:).*))$",
            Pattern.MULTILINE | Pattern.DOTALL);
    Matcher m = PATTERN.matcher(text);
    if (m.find()) {
        text = m.group(1);
        System.out.println(text);
    }

【问题讨论】:

标签: java regex


【解决方案1】:

试试这个正则表达式:

^([\s\S]*)\byo\b[\s\S]*?(cut me:)

没有ms 标志。

在线演示:http://regex101.com/r/lC9yZ5

在我的测试中,这比您的正则表达式更快。 (也可以在 regex101 的调试器上查看

【讨论】:

  • 也可以试试^(.+)\byo\b.*?(cut me:)s 标志。
  • 这两个都很好用!非常感谢!你是一个真正的正则表达式大师! =)
  • 如果你愿意的话,我给你最后一个转折点。我可以发布一个新帖子......但基本上我怎样才能匹配第一个合法的“哟......剪掉我:”模式? regex101.com/r/rY5xD2 我想要的是匹配第一个合法的“yo cut me:”模式?这可能吗?
  • 刚刚发布了一个新问题:bit.ly/1g5K0FY 如上所述。如果您有 aec,感谢您的协助。谢谢
  • 非常感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多