Regex 简化正则表达式

Regex 简化正则表达式,regex,simplification,Regex,Simplification,我正在做关于正则表达式的练习,我真的不确定该怎么做 正则表达式是: ((a*)(b*))* ∪ (a*) 我在这方面真的很差,但我认为((a*)(b*)*可以简化为(a*)∪ b) *但如果这是正确的,则比上一个∪ (a*)实际上只是一个重复,因此我认为整个表达式可以简化为(a∪ b) *。这似乎正确吗 编辑:∪ 代表联合你说得对(a*b*)*可以匹配a和b的任何字符串,因此可以匹配(a U b)*,因此它们是等效的(a U b)*相交a*是a*所以a*是(a U b)*的子集。因此,整个表达

我正在做关于正则表达式的练习,我真的不确定该怎么做

正则表达式是:

((a*)(b*))* ∪ (a*)
我在这方面真的很差,但我认为
((a*)(b*)*
可以简化为
(a*)∪ b) *
但如果这是正确的,则比上一个
∪ (a*)
实际上只是一个重复,因此我认为整个表达式可以简化为
(a∪ b) *。
这似乎正确吗

编辑:∪ 代表联合

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

((a*)(b*))*U(a*)
真正的意思是(复制自)

此表达式当前匹配所有这些序列:
abUa bU U aabbua aaua aaU ua bbU ababua aabbaabbua
(查看)

如果不删除捕获组和剩余的字母顺序,就无法简化此过程

编辑:如果regex语句中的
U
代表“union”,则此表达式无效。在正则表达式中没有任何联合的方法。只有
,您需要使用
|
(管道)来实现这一点。如果您想要联合
((a*)(b*)*
(a*)
,那么它可能是
((a*)(b*)*)*
,但它仍然会匹配类似
abaab
的任何内容


不过,在regex语句中捕获组是没有用的,所以像
[ab]*
这样的东西足以匹配任意数量的
a
b

是否
U
代表联合?也就是说,对于
(a U b)*
您实际上是指在正则表达式中表示为
(a | b)*
还是
[ab]*
?因为如果是这样的话,你的模式看起来就像你建议的那样,
(a | b)*
。如果
U
应该是“联合”的意思,那么使用合适的符号(
)-或者至少在文本中说明它。现在编辑文本:)@Tomalak,你如何使用联盟符号?这个问题不是更好,因为这里有点混乱:]OP中没有捕获,它们是非捕获组。因为在这种情况下,
U
代表联盟(请参阅对OP问题的评论)很遗憾,您的解释不正确(它假定
U
是字符
“U”
)。这是非常模糊的,不是你的错。@perreal非捕获组是
(?:)
OP使用
()
。@Deele,问题不在于Perl,而在于一般的正则表达式和语言。@perreal OP在哪里陈述这一点?你错了<代码>(a U b)*
将匹配文字
a U b
零次或多次。它不再是原始正则表达式想要匹配的。你为什么这么说?联合和或完全是一回事。这个问题是关于正规语言的,它们不在正则表达式的上下文中<代码>(a | b)*
也是错误的表达。OP并没有说他正在询问关于格式、常规语言或类似的问题。他添加了
regex
标签并询问了regex的情况。所以问题应该被否决,你们应该使用合适的正则表达式符号来回答正则表达式的问题。表达式中使用的每个字符都计数。因为它是:literal
a
或literal`b
,零次或多次。最初的正则表达式更多的是关于
a
b`,而不是关于抽象单位。
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