文字a、b、cを含む長さ3の部分文字列で始まり、さらに同じ3文字を含む別の分離した部分文字列を含む単語の集合を見つけるように求められました。
例:abcacb acbbac
これの正規表現を見つけるのを手伝ってください。ありがとう
編集: abcbac - 最初の 3 文字は a、b、c で、その後、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)'
見つけるだろう言葉(言葉(この場合、文字のシーケンスとして定義されます)は、、、(それぞれ1つずつ)[a-zA-Z0-9_]
で構成される3つの文字のシーケンスで始まり、その後にそのようなシーケンスの別の1つ(最初のグループと同じ正規表現を参照)が続きますが、最初のもの(最初のキャプチャグループに一致した文字列を参照し、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文字と正確に一致します.*
間のどれでもマッチします