构造一个简单的正则表达式,只有+,*,()和|

时间:2012-12-03 14:18:48

标签: pcre

{a,b,c}成为字母表。我必须构造一个匹配此字母表中任何输入的正则表达式,如果输入中出现aa,则cc也必须出现(输入中的某个位置)。

不要向前看,不要回头看,没有反向引用,只需使用量词+和*,通过括号和替代方法通过|进行分组。

问题是我不知道如何处理这个问题。例如,这些输入必须匹配:

  • ABBA
  • BCCB
  • bccaa
  • “”(空输入)
  • bccbaa
  • ccbaabb

以下内容不得匹配:

  • AA
  • abaaab
  • BAAA
  • CAAC

如何仅使用这些工具构建这样的正则表达式?

更新

我想过

((cc(b|c)*aa)|(aa(b|c)*cc))+|(ab|ba|ca|ca|bb|bc|cc)*

您如何看待,这是否符合规范?

2 个答案:

答案 0 :(得分:3)

(b|c|a(b|c))*(a|)|(a|b|c)*(aa(a|b|c)*cc|cc(a|b|c)*aa)(a|b|c)*

将匹配:

  • 任意数量的bc s(甚至为零),或a后跟bc,以及可选无人陪伴的a在最后。这些规则共同确保两个a始终由bc分隔,并且将匹配空字符串和单个字符。
  • 包含aa的字符串,最后是cc
  • 在某处包含cc的字符串,最后是aa

(作为参考,如果您需要每个aacc匹配,那么您就有点紧张了。这已不再是常规了。像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)*)$/;

说明:显然你需要在这里匹配三种情况:

  • 整个字符串不包含'aa'序列。这种情况用以下模式表示:

/^(b|c|ab|ac|a$)*$/

...即:“匹配bc符号,abac序列或单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)* $/

现在你有正则表达式的三个部分,我想它很容易将它组合成简单模式。