让{a,b,c}
成为字母表。我必须构造一个匹配此字母表中任何输入的正则表达式,如果输入中出现aa
,则cc
也必须出现(输入中的某个位置)。
不要向前看,不要回头看,没有反向引用,只需使用量词+和*,通过括号和替代方法通过|
进行分组。
问题是我不知道如何处理这个问题。例如,这些输入必须匹配:
以下内容不得匹配:
如何仅使用这些工具构建这样的正则表达式?
更新
我想过
((cc(b|c)*aa)|(aa(b|c)*cc))+|(ab|ba|ca|ca|bb|bc|cc)*
您如何看待,这是否符合规范?
答案 0 :(得分:3)
(b|c|a(b|c))*(a|)|(a|b|c)*(aa(a|b|c)*cc|cc(a|b|c)*aa)(a|b|c)*
将匹配:
b
或c
s(甚至为零),或a
后跟b
或c
,以及可选无人陪伴的a
在最后。这些规则共同确保两个a
始终由b
或c
分隔,并且将匹配空字符串和单个字符。(作为参考,如果您需要每个aa
与cc
匹配,那么您就有点紧张了。这已不再是常规了。像ccccaaaa
这样的字符串需要计算如何到目前为止已经看到了很多cc
,而且FSA无法计算。)
答案 1 :(得分:2)
对于给定的一组参数来说,它更为简单,我想:
/^((b|c|ab|ac|a$)*|(a|b|c)*(cc(a|b|c)*aa|aa(a|b|c)*cc)(a|b|c)*)$/;
说明:显然你需要在这里匹配三种情况:
/^(b|c|ab|ac|a$)*$/
...即:“匹配b
和c
符号,ab
,ac
序列或单a
项的任意数量的任意组合在字符串的末尾“。
整个字符串确实包含'aa'序列,后面(某处)是'cc'序列 - 它仍然只包含[abc]
范围:
/^(a|b|c)* aa(a|b|c)* cc(a|b|c)* $/
(不管怎样,没有空格*
被视为斜体文本标记,即使在<code>
部分内也是如此;你显然在正则表达式中不需要它<)
整个字符串确实包含'aa'序列,在'cc'序列之前(某处) - 并且它仍然仅由[abc]
范围组成:
/^(a|b|c)* cc(a|b|c)* aa(a|b|c)* $/
现在你有正则表达式的三个部分,我想它很容易将它组合成简单模式。