我正在尝试使用 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/