問題
参照セットに存在するすべての文字が他の文字列に存在するかどうかを確認できる正規表現を作成しようとしていますが、奇数 (1、3、5、...) のみです。
問題を表すDFAの (非常に) 粗い画像を次に示します。
私の(壊れた)ソリューション
私は有限集合 を使い始めたので、基本的に「文字列に奇数の と奇数の の{a, b}
両方があるか?」をチェックします。a
b
残念ながら、私は自分で遠くまで行くことはできませんでした。このスレッドは、この概念に非常に似ていますが、から回答を得ることができませんでした(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
。(私はそれがどのように機能するかを理解していますが、存在する両方のアイテムの奇数をチェックするために変換する方法は理解していません。)
これが私がこれまでに思いついたものです: ^((ab|ba)(bb|aa)?|(bb|aa)?(ab|ba))+$
. これは基本的に、orの後にab
orba
が続くbb
かどうかをチェックします。(この逆も行い、最初に二重文字をチェックします。) これは無限に繰り返すことができます。私が抱えている問題は、文字列と一致するように調整できないように見えることです。aa
ab
ba
abaa
abbb
baaa
babb
bbaaba
bbaa
さらに、上記の方法は、たとえば、を考慮して動的に調整することはできませんが{a, b, c}
、最初の問題を解決するためにこれを放棄しても構わないと思っています。
テスト
これが私のテスト文字列と目的の出力です。括弧内に理由を示します。
"ba" # True (1a, 1b)
"abbb" # True (1a, 3b)
"bbba" # True (1a, 3b)
"bbab" # True (1a, 3b)
"ababab" # True (3a, 3b)
"bbaaba" # True (3a, 3b)
"abb" # False (2b)
"aabb" # False (2a, 2b)
"aabba" # False (2b)
"" # False (0a, 0b is "even")
"a" # False (0b is "even")
"b" # False (0a is "even")
質問
それで、これは正規表現を介して可能ですか?それとも、正規表現は DFA よりも制限されていますか? 基本的なループで実行できることは承知していますが、これは私が目指していることではありません。