[英]Capture stream of digits which is not followed by certain digits
我想捕獲不帶某些數字的數字流。 例如
input = abcdef lookbehind 123456..... asjdnasdh lookbehind 789432
我只想使用負前瞻捕獲789432,而不是123。
我嘗試了(?<=lookbehind )([\\d])+(?!456)
但它捕獲了123456
和789432
。
使用(?<=lookbehind )([\\d])+?(?!456)
僅捕獲1
和7
。
對我來說,分組不是一個選擇,因為我的用例不允許我這樣做。
有什么方法可以使用純正則表達式捕獲789432
而不是123
? 答案的解釋表示贊賞。
您可以使用帶有負數的所有格量詞
(?<=lookbehind )\d++(?<!456)
^^ ^^^^^^
請參閱此正則表達式演示 。
具有原子組的同義詞模式:
(?<=lookbehind )(?>\d+)(?<!456)
細節
(?<=lookbehind )
-與字符串中緊隨其后的位置相匹配的正向后lookbehind
\\d++
-1+個數字所有格匹配,不允許回溯到模式中(引擎無法從與\\d++
匹配的任何數字中重試匹配) (?<!456)
-如果與\\d++
匹配的最后3位數字是456
則負向后檢查將使匹配失敗。 為什么往后看,為什么不往前看
后面的負向(?<!...)
確保某個模式與當前位置的左側不立即匹配。 如果負向超前(?!...)
的模式與當前位置的右側立即匹配,則匹配失敗。 這里的“失敗”表示正則表達式引擎放棄了當前匹配字符串的方式,如果在后向/向前查找之前存在量化模式,則引擎可能會回溯到這些模式中以嘗試以不同方式匹配字符串。 請注意,這里的所有格修飾符使引擎不可能多次執行456
次后向檢查,只有用\\d++
抓住所有數字后才執行。
您(?<=lookbehind )([\\d])+(?!456)
正則表達式匹配123456
因為\\d+
以貪婪的方式匹配這些數字(一次全部匹配),而(?!456)
在它們后面檢查456
,並且由於那里沒有456
,因此返回匹配項。 (?<=lookbehind )([\\d])+?(?!456)
僅匹配一位,因為\\d+?
以惰性方式匹配,匹配1位數字,然后執行loolahead檢查。 由於1
之后沒有456
,因此返回1
。
為什么
++
所有格量詞
如果以前存在量化模式,則它不允許正則表達式引擎以其他方式重試匹配字符串。 因此, (?<=lookbehind )\\d+(?<!456)
匹配123456
中的12345
,因為6
之前沒有456
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.