13

次のように、任意の組み合わせで長さを変えて、文字a、b、cを1回一致させるにはどうすればよいですか。

式は次の場合と一致する必要があります。

abc
bc
a
b
bca

ただし、これらと一致しないようにする必要があります。

abz
aab
cc
x
4

6 に答える 6

18

正規表現パターンを使用する

\b(?!\w*(\w)\w*\1)[abc]+\b

このパターンは任意のセットとサイズで使用でき[abc]、目的のセットに置き換えるだけです...


ここに画像の説明を入力してください

(上記の出力はmyregextesterからのものです)

于 2012-11-24T23:24:44.200 に答える
6
^(?=([^a]*a?[^a]*)$)(?=([^b]*b?[^b]*)$)(?=([^c]*c?[^c]*)$)[abc]{1,3}$

これは先読みで機能します。

このパターンには、次の3つのバリエーションがあります。(?=([^a]*a?[^a]*)$)

aそれは言う:ここ(最初)から最後まで多くても1つある必要があります。

先読み後参照の組み合わせ:

^([abc])((?!\1)([abc])((?!\1)(?!\3)[abc])?)?$
于 2012-11-24T22:44:58.957 に答える
3

コレクションを締めくくるには:

^(?:([abc])(?!.*\1))+$

より多くの文字セットを処理したいですか?問題ない:

^(?:([abcdefgh])(?!.*\1))+$

編集:どうやら私は質問を読み間違えました。"abc"やのような個々の文字列を検証しているのではなく"ba"、より大きな文字列で単語全体の一致を見つけようとしています。これが私がそれをする方法です:

\b(?:([abc])(?![abc]*\1))+\b

トリッキーな部分は、先読みが現在一致している単語の終わりを超えて見えないようにすることです。たとえば、先読みをとして残した場合、先読みがinの重複として誤ってinにフラグを立てるため、 inとの(?!.*\1)一致に失敗します。先読みが有効な文字()のみを参照できるようにすると、十分に短いひもにつながれます。また、現在の単語に無効な文字が含まれている場合でも、とにかくそれらを見つけるのは先読みの仕事ではありません。abcabc zaazaaabc[abc]*

(これを私の注意を喚起してくれたHonest Abeに感謝します。)

于 2012-11-25T00:57:25.783 に答える
1
^(?=(.*a.*)?$)(?=(.*b.*)?$)(?=(.*c.*)?$)[abc]{,3}$

固定された先読みは、各文字の出現回数を1回に制限します。

于 2012-11-24T22:24:29.397 に答える
1

この正規表現を試してください:

^([abc])((?!\1)([abc]))?((?!(\1|\2))([abc]))?$

regexpalにチェックイン

于 2012-11-24T22:46:53.383 に答える
0

コメントでリンクしました(これは、Javaで正規表現を使用して繰り返される文字を見つける方法の一種です)。しかし、より具体的には、正規表現:

(\w)\1+

同じキャラクターの任意の2つ以上に一致します。それを否定すると、正規表現が得られます。

于 2012-11-24T22:29:51.060 に答える