次のケースに一致するようにしばらく試みましたが、正規表現が得意ではないので、助けが来ることを願っています...
a または b を含むすべての単語を一致させる必要がありますが、各 a は b で区切る必要があるため、どの単語にも aa はありません。
使用できる単語: a、b、ba、ababbaba 使用でき
ない単語: aa、babaa
次のケースに一致するようにしばらく試みましたが、正規表現が得意ではないので、助けが来ることを願っています...
a または b を含むすべての単語を一致させる必要がありますが、各 a は b で区切る必要があるため、どの単語にも aa はありません。
使用できる単語: a、b、ba、ababbaba 使用でき
ない単語: aa、babaa
固定された否定的な先読みを使用します。
^(?!.*aa)[ab]+$
この式[ab]+
は、文字列が a と b で構成されていることを意味します (非常に単純です)。
(?!.*aa)
で始まる式は、 ^
「aa」が入力のどこにも現れないことを表明します。
先読みせずに解決するには:
^(b|ab|a$)+$
or
まとめて使用された用語は、左から右の優先順位で消費されます。それを念頭に置いて、正規表現がどのように機能するかは明らかです。
ライブデモで動作するこの正規表現をご覧ください
/^a?(ba?)*$/
説明...
/^ # start regex and start of string
a? # optional a
( # start group
b # exactly one b
a? # optional a
)* # end group, and repeat zero or more times
$/ # end regex and end of string
平易な英語では、最初の文字は である場合もあればa
、メインの繰り返しグループに右に移動する場合もあり、これは 0 回以上繰り返すことができ、末尾までb
0 または 1 が続くa と一致します。a
(コメントごとに壊滅的なバックトラックを避けてください)
/^a?(b|ba)*$/
説明した...
/^ # start regex and start of string
a? # optional a
( # start group
b|ba # match `b` or `ba`
)* # end group, and repeat zero or more times
$/ # end regex and end of string
平易な英語では、最初の文字はa
, または メインの繰り返しグループに移動します。これは 0 回以上繰り返され、 または のいずれb
かで構成されba
、一致と正規表現を終了します。
これがうまくいくかどうかを確認してください。\b((a?b+a?)+)\b|\b((a?b+)+)\b|\b(((b+a?)*)\b)
考えられるすべてのケースを検証する時間がありませんでした。
このオンライン正規表現オンライン検証ツールを使用できます
乾杯