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的情况。所以问题应该被否决,你们应该使用合适的正则表达式符号来回答正则表达式的问题。表达式中使用的每个字符都计数。因为它是:literala
或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