次のように、任意の組み合わせで長さを変えて、文字a、b、cを1回一致させるにはどうすればよいですか。
式は次の場合と一致する必要があります。
abc
bc
a
b
bca
ただし、これらと一致しないようにする必要があります。
abz
aab
cc
x
次のように、任意の組み合わせで長さを変えて、文字a、b、cを1回一致させるにはどうすればよいですか。
式は次の場合と一致する必要があります。
abc
bc
a
b
bca
ただし、これらと一致しないようにする必要があります。
abz
aab
cc
x
正規表現パターンを使用する
\b(?!\w*(\w)\w*\1)[abc]+\b
このパターンは任意のセットとサイズで使用でき[abc]
、目的のセットに置き換えるだけです...
例:
(上記の出力はmyregextesterからのものです)
コレクションを締めくくるには:
^(?:([abc])(?!.*\1))+$
より多くの文字セットを処理したいですか?問題ない:
^(?:([abcdefgh])(?!.*\1))+$
編集:どうやら私は質問を読み間違えました。"abc"
やのような個々の文字列を検証しているのではなく"ba"
、より大きな文字列で単語全体の一致を見つけようとしています。これが私がそれをする方法です:
\b(?:([abc])(?![abc]*\1))+\b
トリッキーな部分は、先読みが現在一致している単語の終わりを超えて見えないようにすることです。たとえば、先読みをとして残した場合、先読みがinの重複として誤ってinにフラグを立てるため、 inとの(?!.*\1)
一致に失敗します。先読みが有効な文字()のみを参照できるようにすると、十分に短いひもにつながれます。また、現在の単語に無効な文字が含まれている場合でも、とにかくそれらを見つけるのは先読みの仕事ではありません。abc
abc za
a
za
a
abc
[abc]*
(これを私の注意を喚起してくれたHonest Abeに感謝します。)
^(?=(.*a.*)?$)(?=(.*b.*)?$)(?=(.*c.*)?$)[abc]{,3}$
固定された先読みは、各文字の出現回数を1回に制限します。
コメントでリンクしました(これは、Javaで正規表現を使用して繰り返される文字を見つける方法の一種です)。しかし、より具体的には、正規表現:
(\w)\1+
同じキャラクターの任意の2つ以上に一致します。それを否定すると、正規表現が得られます。