我想選擇具有精確 n 次出現的相同元素。
匹配此字串中精確重復 3 次的字母:“aaaaabbbcccccccccdddee”
這應該回傳“bbb”和“ddd”
如果我定義我應該匹配的內容,如“b{3}”或“d{3}”,這會更容易,但我想匹配所有元素
我試過了,我想出的最接近的是這個正則運算式:(.)\1{2}(?!\1) 它回傳"aaa","bbb","ccc","ddd"
由于“非固定寬度” (?<!\1)
uj5u.com熱心網友回復:
一種可能性是使用一個正則運算式來查找一個不跟隨其自身(或行首)的字符,然后是三個相同的字符,然后是另一個與后三個不同的字符,即
(?:(.)(?!\1)|^)((.)\3{2})(?!\3)
正則運算式 101 上的演示
匹配在第 2 組中被捕獲。但問題是它在匹配之前吸收了一個字符,因此無法找到相鄰的匹配:如演示中所示,它只匹配aaa和in 。ccceeeaaabbbcccdddeee
這個問題可以通過使整個正則運算式成為前瞻來解決,這是一種允許捕獲重疊匹配的技術,如本問題所述。所以:
(?=(?:(.)(?!\1)|^)((.)\3{2})(?!\3))
同樣,比賽在第 2 組中被捕獲。
正則運算式 101 上的演示
uj5u.com熱心網友回復:
這變得很棘手,因為您不能將反向參考放在負字符集中,因此我們將使用后向查找,然后使用負前瞻,如下所示:
(?<=(.))((?!\1).)\2\2(?!\2))
這表示找到一個字符,但不要將其包含在匹配中。然后向前看,確定下一個角色是不同的。接下來將其消耗到捕獲組 2 中,并確保接下來的兩個字符匹配它,而后面的一個不匹配。
不幸的是,這不適用于字串開頭的 3 個字符。我不得不添加一個完整的替代條款來處理這種情況。所以最終的正則運算式是:
(?:(?<=(.))((?!\1).)\2\2(?!\2))|^(.)\3\3(?!\3)
這處理所有情況。
uj5u.com熱心網友回復:
您可以匹配您不想保留的內容,即相同字符的 4 倍或更多倍。
然后使用交替捕獲您想要保留的內容,即相同字符的 3 倍。
所需的匹配在捕獲組 2 中。
(.)\1{3,}|((.)\3\3)
(.)捕獲組1,匹配單個字符\1{3,}在第 1 組中重復相同的字符、3 次或更多次|要么(捕獲組 2(.)\3\3捕獲組 3,匹配單個字符后跟 2 個反向參考,匹配組 3 中相同字符的 2 倍
)關閉組 2
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/451875.html
標籤:正则表达式
下一篇:嵌套html標簽的問題
