トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

4-10 aが偶数個でbが奇数個の文字列

正規表現パズル

ab以外の文字が存在しなくて、かつ、
aが偶数個で、bが奇数個の行を検索する

検索前


検索後


対象データ

a
aa
aaa
b
bb
aab
aabb
abaaa
ababaa


正規表現

^(b|a(aa|bb)*(ab|ba))(aa|bb|(ab|ba)(aa|bb)*(ab|ba))*$

別解

^(?=[^a]*$|([^a]*a[^a]*a[^a]*)*$)(?![^b]*$|([^b]*b[^b]*b[^b]*)*$)[ab]*$

別解

^(?=(([^a]*a){2})*[^a]*$)(?!(([^b]*b){2})*[^b]*$)[ab]*$


解説

Perl正規表現雑技からの転載です

別解では、
偶数は2の倍数なので、2の倍数か調べてます

また、
bの個数は、偶数か奇数なので
補集合の概念を使って、
bが奇数個である ⇔ bが偶数個でない
といった同値変形を行い、否定先読みを使ってます