簡體   English   中英

正則表達式之間的所有匹配

[英]RegEx all matches between

我想在文本foo bar foo 8 bar foo bar 8 foo bar foo匹配所有foobar (那些僅在8字符之間的那些)。

這是我試過的: 8.*(foo|bar).*8

問題是它只匹配最后一個bar因為(我相信)貪婪的量詞盡其所能。

我在嘗試搜索如何解決此問題時已盡力而為,但最終找不到任何東西,所以我在這里問。

我當前的 RegEx 以便您可以更好地理解我的意思: https : //regex101.com/r/p0tQws/1

8([^8]*(foo|bar)+[^8]*)8

有關說明,請參閱regex101

這就是問題的本質:

重復捕獲組只會捕獲最后一次迭代。 在重復組周圍放置一個捕獲組以捕獲所有迭代,或者如果您對數據不感興趣,則使用非捕獲組代替

正則表達式捕獲的替代方法是splitmap或類似的數組函數:

let   str = 'foo bar foo 8 bar foo cruft foo fnooz bar 8 foo bar foo'
let   is8 = false

// split string on spaces 
str.split(/\s/).map(el => {
  // toggle 'is8' when encountered
  if(el == 8)
    is8 = !is8

  // 'is8' is true, and el matches regex
  if(is8 && /(foo|bar)/.test(el)) 
  {        
    // do something with el between the 8's e.g. uppercase
    return el.toUpperCase()
  }
  return el
}).join(' ')

// yields "foo bar foo 8 BAR FOO cruft FOO fnooz BAR 8 foo bar foo"

您可以匹配第一個8 ,然后在第 1 組中捕獲第二次出現的 8 之間的內容,如果您還想在接下來出現另一個 8 時獲得匹配,則使用正向預測。

如果你想要單獨的部分,你可以在一個空間上拆分組 1 中的數據。

 \b8\s+([^8]+)(?=\s+8\b)
  • \\b8匹配 8 前面有一個單詞邊界
  • \\s+匹配 0+ 個空白字符
  • ([^8]+)捕獲第 1 組,匹配除8以外的任何字符 1+ 次
  • (?=正向預測
    • \\s+8\\b匹配 0+ 個空白字符並匹配 8 后跟一個單詞邊界
  • )關閉前瞻

正則表達式演示

 const pattern = /\\b8\\s+([^8]+)(?=\\s+8\\b)/; let str = "foo bar foo 8 bar foo bar 8 foo bar foo"; str = str.match(pattern)[1].split(" "); console.log(str);


如果您還希望能夠在兩者之間匹配例如800 ,則可以使用

\b8\s+(.+?)(?=\s+8\b)

正則表達式演示

(在 regex 101 中嘗試時,它似乎允許在 Javascript 中進行非固定寬度的后視。如果這對你有用,你可以試試這個)

如果您的環境允許非固定寬度的后視,您可以嘗試

(?<=8.*)(foo|bar)(?=.*8)
Explanation:
(?<=   )                   positive look-behind, i.e. preceded by
    8.*                        8, then zero-or-more character
        (foo|bar)          "foo" or "bar", in capture group
                 (?=   )   postiive look-ahead, i.e. followed by
                    .*8        zero-or-more characters, then 8

https://regex101.com/r/p0tQws/3

暫無
暫無

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

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