java - 可能的正则表达式回溯问题?

标签 java regex

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

http://regex101.com/r/cI3fG4

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

这适用于小文件/输入。

但是,如果我在 Java 中针对一个非常大的 (100k) 文件运行此程序,该文件没有模式匹配(只是一堆文本 - war 与和平片段),则可能需要 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);
    }

最佳答案

试试这个正则表达式:

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

没有 ms 标志。

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

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

关于java - 可能的正则表达式回溯问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22523641/

相关文章:

java - 在 Tomcat 7 中运行 Java EE 7 WebSocket

php - 第 222 行警告 : preg_match(): Compilation failed: quantifier does not follow a repeatable item at offset 1 in wp-includes/class-wp. php

javascript - JS - 收集字符之间的所有字母(:)

java - 如何将 "send"变量从应用程序转移到不同的模块?

java - 将目录存储为文件对象还是字符串?

java - 我如何从java中的Youtube channel API v3获取所有上传的视频

Javascript RegEx 没有按预期返回 false

python - 使用正则表达式匹配基因组位置

regex - 在 Rust 中保存/加载编译的正则表达式?

java - 编写 java 程序连接 DB2 和获取数据时出现运行时错误 "Class Not found"