[英]RegEx all matches between
我想在文本foo bar foo 8 bar foo bar 8 foo bar foo
匹配所有foo
和bar
(那些僅在8
字符之間的那些)。
這是我試過的: 8.*(foo|bar).*8
問題是它只匹配最后一個bar
因為(我相信)貪婪的量詞盡其所能。
我在嘗試搜索如何解決此問題時已盡力而為,但最終找不到任何東西,所以我在這里問。
我當前的 RegEx 以便您可以更好地理解我的意思: https : //regex101.com/r/p0tQws/1
8([^8]*(foo|bar)+[^8]*)8
有關說明,請參閱regex101
這就是問題的本質:
重復捕獲組只會捕獲最后一次迭代。 在重復組周圍放置一個捕獲組以捕獲所有迭代,或者如果您對數據不感興趣,則使用非捕獲組代替
正則表達式捕獲的替代方法是split
和map
或類似的數組函數:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.