我正在尝试使用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.这就是我需要后置断言的原因。或者你会找到一种方法来定义操作符以找到我正在寻找的位置。
答案 0 :(得分:1)
您没有使用嵌套量词,但我怀疑嵌套的lookbehind会导致类似的问题。我怀疑你根本不需要那个外观前瞻/外观 - 如何仅使用正则表达式的内部部分(两者都相同)执行单个正则表达式搜索,并从每个结果中检索起始位置和结束位置?