首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个regexs [ab]*和([ab])\1

比较两个regexs [ab]*和([ab])\1
EN

Stack Overflow用户
提问于 2014-06-07 03:02:38
回答 3查看 64关注 0票数 0

让我好奇的是

  • 为什么[ab]*不重复匹配的部分,而是重复[ab]。换句话说,为什么它与a*b*不一样?
  • 为什么([ab])\1重复匹配的部分,而不重复[ab]。换句话说,为什么它只能与aabb相匹配,而不能与abba匹配?

这是因为()的优先级低于[],而*的优先级高于[]?我不知道我是否认为这些操作人员是不合适的。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-07 03:07:27

两者是完全不同的。

当您说[ab]*时,它意味着ab为零或更多次。因此,它将匹配"“、"a”、"b“以及ab的任何组合。

但是([ab])\1意味着ab将被匹配,然后被捕获。\1被称为反向引用。它指的是RegEx中已经捕获的组。在我们的例子中,([ab])。因此,如果捕获了a,那么它将再次只匹配a。如果它是b,那么它将再次匹配b。它只能匹配aabb

票数 1
EN

Stack Overflow用户

发布于 2014-06-07 03:07:55

代码语言:javascript
复制
[ab]*

这也不匹配任何东西,abaaabbb和任何长度的字符串。匹配不受长度限制,并且由于没有捕获组,所以它的语句匹配由所有ab字符组成的任意长度的字符串。

代码语言:javascript
复制
([ab])\1

在这种情况下,它强制匹配的字符串为两个字符,因为没有重复。首先,它必须匹配父类内部的内容(对于捕获第一组),然后它必须匹配它在第1组中捕获的内容,这意味着匹配必须是两个字符长,两个字符是相同的。

票数 1
EN

Stack Overflow用户

发布于 2014-06-07 03:39:53

让我们看看您的每个表达式,然后我们将添加一个有趣的扭曲,这可能解决任何悬而未决的混乱。

[ab]*等同于(?:a|b)*,换句话说,无论多少次匹配ab,例如abbbaab

[ab]等同于(?:a|b),换句话说,只匹配ab一次,例如a

a*的意思是任意次数地匹配a (例如,aaaa )

b*的意思是任意次数地匹配b (例如,bb )

您说([ab])\1只能与aabb匹配。这是正确的,因为

([ab])\1的意思是匹配ab一次,将其捕获到组1,然后再匹配组1,即如果有a,则为a,如果有b,则为b

再一次变体(Perl,PCRE)

([ab])(?1)的意思是匹配ab一次,将其捕获到组1,然后匹配组1中指定的表达式,因此,再次匹配[ab]。这将与aaabbabb相匹配。因此,

([ab])(?1)*可以与[ab]+匹配,([ab]*)(?1)*可以与[ab]*匹配

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24093235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档