2014-05-09 128 views
5

我正在通过有关正则表达式的练习,而且我很不确定如何做到这一点。简化正则表达式

正则表达式是:

((a*)(b*))*U(a*) 

我在这个非常糟糕,但我认为((a*)(b*))*可以简化为(a U b)*但是,如果这是正确的,比上届U(a*)其实只是重复,所以我认为整个表达式可以简化为(a U b)*.这看起来是否正确?

编辑︰ü代表工会

+2

'U'代表工会吗?也就是说,对于'(a U b)*',你实际上是指在正则表达式中用'(a | b)*'或'[ab] *'表示什么?因为如果你认为这样的模式看起来就像你所建议的那样只是'(a | b)*'。 –

+1

如果'U'被认为是“联合”,那么使用正确的符号('∪') - 或者至少在文本中声明它是适当的。 – Tomalak

+0

现在编辑文本:) – user2795095

回答

3

你是对的。 (a*b*)*可以匹配a和b的任何字符串,所以它们可以相等。 (a U b)*相交a*a*所以a*(a U b)*的子集。因此,整个表达式可以简化为(a U b)*

+0

你错了。 '(a U b)*'将与文字'a U b'匹配零次或多次。它不再是原始正则表达式的意图匹配。 – Deele

+0

你为什么这么说? Union和OR是完全一样的东西。这个问题是关于正式的正式语言。 – perreal

+0

他们不是在正则表达式的情况下。 '(a | b)*'也是错误的表达。 OP没有声明他在询问_format正式语言_或类似的东西。他添加了'regex'标签并询问了正则表达式。所以问题应该是downvoted,你应该使用适当的正则表达式符号,来回答正则表达式问题。表达式中使用的每个字符都计数 – Deele

-2

的真正含义是什么((a*)(b*))*U(a*)是(从here复制)

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
    (      group and capture to \1 (0 or more times 
          (matching the most amount possible)): 
-------------------------------------------------------------------------------- 
    (      group and capture to \2: 
-------------------------------------------------------------------------------- 
     a*      'a' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \2 
-------------------------------------------------------------------------------- 
    (      group and capture to \3: 
-------------------------------------------------------------------------------- 
     b*      'b' (0 or more times (matching the 
           most amount possible)) 
-------------------------------------------------------------------------------- 
    )      end of \3 
-------------------------------------------------------------------------------- 
)*      end of \1 (NOTE: because you are using a 
          quantifier on this capture, only the LAST 
          repetition of the captured pattern will be 
          stored in \1) 
-------------------------------------------------------------------------------- 
    U      'U' 
-------------------------------------------------------------------------------- 
    (      group and capture to \4: 
-------------------------------------------------------------------------------- 
    a*      'a' (0 or more times (matching the most 
          amount possible)) 
-------------------------------------------------------------------------------- 
)      end of \4 

这个表达式目前匹配所有这些序列:abUa bU U aabbUaa aaUaa aaU Uaa bbU ababUaa aabbaabbUaa(看here

有没有办法来简化这一点,而不删除捕获组和剩余的字母顺序。

编辑:如果您的正则表达式中的U代表“union”,那么这个表达式是无效的。在正则表达式中没有办法联合任何东西。只有OR,你需要使用|(管道)。如果你想要工会((a*)(b*))*(a*)那么可能它会是((a*)(b*))*,但它仍然会匹配abaab之类的东西。

尽管如此,在您的正则表达式语句中捕获组是无用的,所以类似[ab]*就足以匹配任何数量的ab's。

+0

没有捕获,它们是OP中的非捕获组。 – perreal

+0

因为在这种情况下'U'代表联合(见OP的问题的评论),你的解释不幸是不正确的(它假设'U'是字符'U'')。这很模糊,但不是你的错。 –

+0

@perreal非捕获组是'(?:)'OP使用'()' – Deele