很慢的后视

时间:2014-03-10 16:02:07

标签: 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]|$))"""

请注意,这两个表达式是相同的,除了第一个“=”在第二个表达式中被“&lt; =”替换。我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.这就是我需要后置断言的原因。或者你会找到一种方法来定义操作符以找到我正在寻找的位置。

1 个答案:

答案 0 :(得分:1)

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