我有一个和/或正则表达式即(PatternA | PatternB),其中我只在PatternB不存在时才采用PatternA(PatternB总是在PatternA之后出现,但更重要)所以我在PatternA Pipe中放置了一个负向前视。为什么Negative Lookahead超时和/或Pipe
这适用于较短的文本块:
https://regex101.com/r/bU6cU6/5
但在较长的文本块超时:
https://regex101.com/r/bU6cU6/2
我不明白的是,如果我把PatternA与Neg在同一长文本块中独自前行,只需32步即可拒绝它:
https://regex101.com/r/bU6cU6/3
,如果我在同样长的文本块把PatternB单独只需要18个步骤来接受它:
https://regex101.com/r/bU6cU6/4
所以我不知道为什么它正在采取100,000以上/超时首先拒绝(32步),然后用管子接受(18步)。是否有另一种/更好的方法来构建,因此它首先检查PatternA,而不是PatternB,因为现在它正在做一些我不明白从50步到100k +的事情。
在文档中的每个位置执行前瞻。这是非常低效的。您可以在'Option1:'text:'Option1:(?!。* Option2)\ *。*?(?P Bob | David | Ted | Alice)| \ * Option2(?P Juan) –
@WiktorStribiżew这是有道理的。在前面的问题http://stackoverflow.com/questions/39482021/fixing-negative-assertion-for-end-of-string我被告知把它放在字符串的开头,并接受了答案,并继续前进。如果事实上不是正确的方式,也许我应该不接受,因为看起来并不正确。上述和接受的答案在这里都很好地解决了这个问题。 – user3649739