簡答:你不能做你在問什麼。從技術上講,第一部分有一個醜陋的答案,但第二部分(據我瞭解)沒有答案。對於你的第一部分,我有一個非常不切實際的(但純正則表達式)的答案;但是,我有一個非常不切實際的(但純正則表達式)答案;我有一個非常不切實際的(但純正則表達式)答案;我有一個非常不切實際的(但純正則表達式)答案;任何更好的將需要代碼(就像@ rednaw上面更清晰的答案)。我加入了測試,以使其更全面。 (爲了簡單起見,我使用grep -Pio
爲PCRE,不區分大小寫,打印每行一個匹配。)
$ echo "Ben sits on a bench better end" \
|grep -Pio '(?=b(?!en)|(?<!b)en|e(?!n)|(?<!be)n|[^ben])\w+'
sits
on
a
ch
better
end
我基本上製造用於在「本」的任何字母,所以我可以僅包括迭代的特例它們本身並不是字符串「ben」的一部分。正如我所說,即使我在技術上回答您的問題,也不是很實際。如果您需要更多詳細信息,我還保存了a blow-by-blow explanation of this regex。
如果你被迫使用純正則表達式而不是代碼,你最好的辦法就是寫代碼生成正則表達式。這樣你可以保留一個乾淨的副本。
我不知道你在問什麼對你的挑戰的剩餘部分;正則表達式要麼是貪婪的,要麼是懶惰的,我不知道任何可以找到「每一種組合」的實現,而不是任何一種方法的第一種組合。如果有這樣的事情,現實生活中會非常緩慢(而不是簡單的例子);如果他們被迫檢查每一種可能性,基本上是ReDoS,正則表達式引擎的慢速將是不能容忍的。
例子:
# greedy evaluation (default)
$ echo 1a2be3 |grep -Pio '(?!\d[a-z]\d)\w+'
a2be3
# lazy evaluation
$ echo 1a2be3 |grep -Pio '(?!\d[a-z]\d)\w+?'
a
2
b
e
3
我假定你正在尋找1
1a
a
a2
a2b
a2be
a2be3
2
2b
2be
2be3
b
be
be3
e
e3
3
,但我不認爲你可以得到一個純的正則表達式。你需要一些代碼來生成每個子字符串,然後你可以使用正則表達式來過濾禁止的模式(再次,這是關於貪婪vs懶惰與ReDoS)。
這聽起來像你可以用空字符串做一個正則表達式替換你的黑名單模式,看看是否還有什麼東西? – Jon
你能舉一個例子來回答嗎? – Srb1313711
@ Srb1313711任何編程語言的選擇?我不確定替換是否可以在正則表達式中完成。 – skiwi