问题
我正在尝试创建一个正则表达式,我们可以在其中检查某个参考集中存在的所有字母是否存在于其他字符串中,但仅限于奇数(1、3、5,...)。
这是代表问题的DFA的(非常)粗略的图像:
我的(损坏的)解决方案
我开始使用有限集,{a, b}
所以我基本上会检查“字符串中是否同时存在奇数个a
s 和奇数个s?”b
不幸的是,我自己并没有走多远。我首先阅读了这个线程,它与这个概念非常相似,但无法从(aa|bb|(ab|ba)(aa|bb)*(ba|ab))*(b|(ab|ba)(bb|aa)*a)
. (我了解它是如何工作的,但不知道如何将其转换为检查存在的两个项目的奇数。)
到目前为止,这是我想出的:^((ab|ba)(bb|aa)?|(bb|aa)?(ab|ba))+$
。这基本上检查是否有ab
orba
后跟bb
or aa
or nothing,这将导致ab
, ba
, abaa
, abbb
, baaa
, or 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 更受限制?我知道它可以通过一个基本循环来完成,但这不是我想要的。