簡體   English   中英

捕獲沒有特定數字跟隨的數字流

[英]Capture stream of digits which is not followed by certain digits

我想捕獲不帶某些數字的數字流。 例如

input = abcdef lookbehind 123456..... asjdnasdh lookbehind 789432

我只想使用負前瞻捕獲789432,而不是123。

我嘗試了(?<=lookbehind )([\\d])+(?!456)但它捕獲了123456789432

使用(?<=lookbehind )([\\d])+?(?!456)僅捕獲17

對我來說,分組不是一個選擇,因為我的用例不允許我這樣做。

有什么方法可以使用純正則表達式捕獲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

您也可以在后面使用否定式:

(?<=lookbehind )\d+\b(?<!456)

正則演示

正則表達式詳細信息:

  • (?<=lookbehind ) :肯定的向后看,斷言我們在當前位置之前"lookbehind "
  • \\d+\\b :匹配1+個數字,后跟單詞邊界
  • (?<!456) :負向后斷言斷言我們在當前位置之前沒有456

使用負前瞻的替代解決方案

(?<=lookbehind )(?!\d*456)\d+

RegEx演示2

在前瞻表達式(?!\\d*456)需要\\d* ,以便在從當前位置匹配0個或多個數字后可以跳過456

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM