我被要求找到以長度為 3 的子字串開頭的單字集,其中包含字元 a、b 和 c,並且還包含另一個包含相同 3 個字元的不相交子字串
前任。 abcacb abcbac
幫我找一個正規表達式。謝謝
編輯: abcbac - a、b、c 應該作為前 3 個字母,然後 a、b、c 應該更改前 3 個字母的順序。只有 6 個字串。
acbbca abccba bacbca 等等......
答案1
(此處的解決方案假設grep
使用 PCRE 支援建構 GNU(通常是 cygwin 上的情況))。
你的要求的前半部分意味著。
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
或者可能:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'
後半部似乎與前半部相矛盾:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
會發現字(單字在本例中被定義為字元序列),以由,和(每個字元一個)[a-zA-Z0-9_]
組成的 3 個字元的序列開頭,但後面跟著另一個這樣的序列(指與第一組中相同的正規表示式),前提是它是與第一個不同(指與第一個捕獲組匹配的字串,並且是a
b
c
(?1)
(...)
\1
(...)
(?!...)
消極展望操作員)。
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb
答案2
這應該可以做到:
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
匹配正規表示式-w
僅匹配單字[a-c]{3}
將恰好匹配a-c
集合中的 3 個字符.*
將匹配之間的任何內容