括号是否会改变正则表达式的长度?

时间:2016-03-04 01:02:26

标签: regex

Sigma = {a,b}。正则表达式RE = (ab)(ab)*(aa|bb)*b over Sigma

  1. 在RE表示的集合中给出长度为5的字符串。 正确答案:abaab 我的回答:(ab)aab
  2. 我把括号放在那里,因为它们在RE中。我理解为什么我不需要,但我的回答是不正确的?我使用RegEx测试它,并且表达式(ab)aab匹配文本abaab,但是当我颠倒它时它不匹配。

2 个答案:

答案 0 :(得分:1)

您的回答是错误的,因为括号不属于您的符号集。仅使用(ab)aab集中存在的符号无法生成字符串{a,b}

更多的是,您被要求提供一个包含5个符号的字符串,但(ab)aab的长度为7

括号在regex中具有特殊含义。他们创建子regexp和捕获组。例如,(ab)*表示ab可以匹配任意次,包括零。如果没有括号,ab*表示regex匹配一个a,后跟任意数量的b。这是一个不同的表达方式。

例如:

  • 正则表达式(ab)*匹配空字符串(ab零次),abababababababababab等等上;
  • 正则表达式ab*匹配a(后跟零b s),ababbabbb,{{1等等。

如果您只查找子regexp,则示例中的第一组括号无用。 abbbb(ab)个表达式仅匹配ab字符串。但它们可用于捕获字符串的匹配部分,并将其重新用于后引用或替换。

当括号用于正则表达式中的子表达式时,它们是元字符,不匹配字符串中的任何内容。为了匹配开括号字符ab(在字符串中找到),您必须在(regex中将其转义。

\(上的正则表达式(ab)(ab)*(aa|bb)*b匹配的多个字符串:Sigma = { 'a', 'b' }abbababbabababababb

最后一个字符串(ababababaabbaaaabbb)与ababababaabbaaaabbb部分匹配,如下所示:

regex

ab - (ab) ababab - (ab)* - ('ab' 3 times) aabbaaaabb - (aa|bb)* - ('aa' or 'bb', 5 times in total) b - b 字符串匹配的regex(ab)aab,但在这种情况下为
\(ab\)(ab)*(aa|bb)*b

答案 1 :(得分:1)

()是正则表达式的语法并具有语义含义,您可以查看herehere

^&以及正则表达式中的其他保留字符类似,您必须使用特殊句柄来匹配它们,例如:Regex to Match Symbols: !$%^&*()_+|~-=`{}[]:";'<>?,./

此外,特别是在您的问题上下文中,()不应作为字符串的一部分出现,因为它不在字符集(字母表){a,b}中。你提供的字符串的长度为7而不是5,所以说它是错的是正确的。