我有一個很長的字串:
(今天是藍色的日子)(今天是個好日子)(今天是壞日子)(今天是綠色的日子)(今天是藍色的日子)
我想匹配括號組,除非它包含大寫的單詞。該單詞將始終完全大寫,但可能不是唯一完全大寫的單詞 - 但將是唯一完全大寫的單詞。
我有一個很長的字串,我想更改不包含單詞 BAD 的括號組,同時保留 BAD。我希望避免遍歷每個括號組來檢查它是否包含 BAD。
這個: \(. ?\)
將匹配我的括號組。
我試過了:
\(. ?(?=\bBAD\b). ?\) - 這匹配每個組直到包含 BAD 的組。
(?=\bBAD\b). ?\) - 這與“BAD day)”組的結尾相匹配
我嘗試了一些負面回顧的變體,但無法讓它們提供結果。
我知道這有效:
\(.[^BAD] ?\)
直到你包括(今天是藍色的一天) - 然后它失敗了。
任何人都知道一種有效的方法來做到這一點?
uj5u.com熱心網友回復:
您可以使用
\((?>([^()]*\bBAD\b)?)[^()]*\)(?(1)(?!))
請參閱.NET 正則運算式演示。詳情:
\(- 一個(字符(?>([^()]*\bBAD\b)?)-的原子團(即不允許重新嘗試其圖案時回溯發生時):比其他零個或多個字符)并且(然后整個字BAD,所有捕獲到第1組[^()]*- 除(和之外的零個或多個字符)\)- 一個)字符(?(1)(?!))- 如果第 1 組匹配,則觸發回溯(這里,由于我們之前使用了原子組,因此匹配失敗)。
請參閱C# 演示:
var text = "(Today is a blue day) (Today is a good day) (Today is a BAD day) (Today is a green day) (Today is a blue day)";
var matches = Regex.Matches(text, @"\((?>([^()]*\bBAD\b)?)[^()]*\)(?(1)(?!))")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
輸出:
(Today is a blue day)
(Today is a good day)
(Today is a green day)
(Today is a blue day)
uj5u.com熱心網友回復:
這部分(?=\bBAD\b). ?\)斷言 BAD 向右,然后盡可能至少匹配,直到下一個). 它也可以在沒有前瞻的情況下撰寫\bBAD\b. ?\)
這部分[^BAD]匹配除字符以外的任何字符B A D
您可以使用相反的方式使用否定前瞻來斷言 BAD 不在括號之間,并且您還可以添加單詞邊界\b以防止部分匹配。
\((?![^()]*\bBAD\b[^()]*\))[^()]*\)
模式匹配:
\(比賽((?![^()]*\bBAD\b[^()]*\))負前瞻,斷言不是可選括號后跟單詞 BAD 直到右邊的第一個右括號[^()]*除()使用否定字符類外,匹配 0 次任何字符\)比賽)
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358698.html
