我有以下正则表达式和输入:
基本上,我想匹配最后一个“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:)
没有 m
和 s
标志。
在线演示:http://regex101.com/r/lC9yZ5
在我的测试中,这比您的正则表达式更快。 (你也可以在regex101的调试器上查看)
关于java - 可能的正则表达式回溯问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22523641/