如何创建正则表达式以匹配非连续字符?

时间:2012-03-28 05:41:02

标签: regex

如何为abc的字符串创建正则表达式,以便aabb被拒绝?

例如,abcabccababcccccab将被接受,aaabcaaabbccccabcccababaa将被拒绝。

3 个答案:

答案 0 :(得分:4)

如果这不是纯粹的学术问题,您只需搜索aabb并否定您的逻辑,例如:

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已从图片中删除。那些没有aabb的唯一序列是:

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]+$

here on Regexr

这个正则表达式会做两件事

  1. 验证您的字符串仅包含a,b和c
  2. 在aa和bb上失败
  3. ^匹配字符串的开头

    (?!.*(?:aa|bb)) negative lookahead assertion,如果字符串中有aa或bb,则会失败

    [abc]+ character class,只允许a,b,c至少一个(+

    $匹配字符串

    的结尾