如何为a
,b
和c
的字符串创建正则表达式,以便aa
和bb
被拒绝?
例如,abcabccababcccccab
将被接受,aaabc
或aaabbcccc
或abcccababaa
将被拒绝。
答案 0 :(得分:4)
如果这不是纯粹的学术问题,您只需搜索aa
和bb
并否定您的逻辑,例如:
s='abcccabaa'
# continue if string does not match.
if re.search('(?:aa|bb)', s) is None:
...
或者只是扫描字符串中的两种模式,避免昂贵的正则表达式:
if 'aa' not in s and 'bb' not in s:
...
对于这么简单的任务,RE可能完全矫枉过正。
P.S。:示例在Python中,但当然这个原则适用于其他语言。
答案 1 :(得分:0)
使用& operator(intersection)和〜(complement):
(a|b|c)*&~(.*(aa|cc).*)
在没有这些运算符的情况下重写这一点很棘手。通常的方法是将其分解为案例。
在这种情况下,并不是那么困难。
假设字母c
已从图片中删除。那些没有aa
和bb
的唯一序列是:
e (empty string)
a
b
b?(ab)*a?
接下来我们可以做的是插入一些可选的' c'进入所有可能的内部地方:
e (empty string)
a
b
(bc*)?(ac*bc*)*a?
接下来,我们必须承认非aabb
这样的非法序列会被接受,如果非选择性的' c'运行放在中间,例如acacbcbc'. We allow a final
一个and
b . This pattern can take care of our lone
a and
b`个案,以及匹配空字符串:
(ac+|bc+)*(a|b)?
然后将它们组合在一起:
((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?)
我们几乎就在那里:我们还需要认识到这种模式可以发生任意次数,只要在发生之间存在划分“c”,并且任意前导或尾随c
- 围绕整个事情的运行
c*((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?)(c+((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?))*c*
先生。 Regex Philbin,我没有提出任何不能处理的案例,所以我将其作为我的最终答案。
答案 2 :(得分:0)
^(?!.*(?:aa|bb))[abc]+$
这个正则表达式会做两件事
^
匹配字符串的开头
(?!.*(?:aa|bb))
negative lookahead assertion,如果字符串中有aa或bb,则会失败
[abc]+
character class,只允许a,b,c至少一个(+
)
$
匹配字符串