java - 后视很慢

标签 java regex performance scala

我正在尝试使用 java regex 恢复两个位置

第一个由正则表达式给出:

val r="""(?=(?<=[ ]|^)[^ ]{1,21474836}(?=[ ]|$)(?<=[^A-Z]|^)[A-Z]{1,21474836}(?=[^A-Z]|$))"""

第二个由正则表达式给出

val p="""(?<=(?<=[ ]|^)[^ ]{1,21474836}(?=[ ]|$)(?<=[^A-Z]|^)[A-Z]{1,21474836}(?=[^A-Z]|$))"""

请注意,这两个表达式是相同的,除了第一个“=”在第二个表达式中被“<=”替换。我是 not using neste quantifiers

我的测试命令如下:

r.findAllMatchIn("a <b/>"*100) //.... some long string of size 600...
p.findAllMatchIn("a <b/>"*100) //.... some long string of size 600...

第一个示例在执行过程中几乎是即时的,而第二个示例需要几十秒。如果我在 REPL 中启动相同的示例,两者都非常快。

这是从哪里来的?我怎样才能使第二个表达式更快?

更新:为什么这很重要

请注意,一般来说,我可以有以下类型的表达式:

[^ ]+[^.]+

而且我想知道什么时候可以在给定位置的左边找到这个正则表达式,或者什么时候可以结束。 如果我有以下数据及其下方的位置:

abc145A
0123456

我希望前面表达式的末尾匹配位置 1、2、3、4、5 和 6。如果我使用非贪婪的重复百搭,那么它将匹配 1、3 和 5。如果我使用贪婪的运算符,它只匹配 6 个。这就是为什么我需要回顾断言。或者你会给我找到一种方法来定义运算符来找到我正在寻找的位置。

最佳答案

您没有使用嵌套量词,但我怀疑嵌套后视会导致类似的问题。我怀疑您根本不需要外部前瞻/后视——仅使用正则表达式的内部部分(两者通用)执行单个正则表达式搜索,并从每个结果中检索开始位置和结束位置如何?

关于java - 后视很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22305186/

相关文章:

java - SinglyLinkedList 中头之后的下一个节点出现 NullPointerException

java - eclipse 3.4无法启动

regex - 使用 perl 程序在文件中查找文本

javascript - 使用js验证邮件

java - 延迟加载 PDF

javascript - MongoDB - 更新集合中所有记录的最快方法是什么?

SQL:long varchar 及其对性能的影响

java - 检查 libGDX 中的网络连接

c# - 为什么 visual studio 中的正则表达式在程序中不起作用?

c# - 哪些 Java/Scala 或 .NET Web 框架支持修改源代码并立即运行工作流 e.i.没有很长的重建/重新部署程序?