我有一個和/或正則表達式即(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