Ruby 括号分组如何影响正则表达式结果?
我的正则表达式应该匹配Ruby 括号分组如何影响正则表达式结果?,ruby,regex,Ruby,Regex,我的正则表达式应该匹配a、b、c或d的任意序列,或者字符x;字符串“abcdxabcd”应该有三个单独的匹配项“abcd”,“x”,和“abcd” 我不理解以下正则表达式之间的区别,我正在寻找括号如何影响结果的详细解释。对于测试字符串“abcdxabcd”: /[abcd]+|x/这一个似乎有效。接下来的四个没有 /(d|[abc])+|x/返回三个匹配组{d}、{[empty]}和{d} /(d|[abc]+)+|x/返回三个匹配组{d}、{[empty]}和{d} /(d |[abc]+)+
a
、b
、c
或d
的任意序列,或者字符x
;字符串“abcdxabcd”
应该有三个单独的匹配项“abcd”
,“x”
,和“abcd”
我不理解以下正则表达式之间的区别,我正在寻找括号如何影响结果的详细解释。对于测试字符串“abcdxabcd”
:
/[abcd]+|x/
这一个似乎有效。接下来的四个没有/(d|[abc])+|x/
返回三个匹配组{d}、{[empty]}和{d}/(d|[abc]+)+|x/
返回三个匹配组{d}、{[empty]}和{d}/(d |[abc]+)+|(x)/
返回三个匹配组{d、[empty]}、{[empty]、x}和{d、[empty]}/((d |[abc]+)+|(x))/
返回三个匹配组{abcd,d,[empty]}、{x,[empty],x}和{abcd,d,[empty]}我并不完全熟悉比赛小组的概念,这是我在这里提出的问题的一部分。我在这里的目标不是找到一个有效的表达式,而是了解这些情况之间的差异,并了解那些不起作用的情况实际上在做什么。=====
/[abcd]+|x/
这肯定有效,此表达式匹配[abcd]+
或
匹配x
<代码>[abcd]+匹配字母a
、b
、c
和d
的一个或多个组合x
匹配文本x
因此,当您对abcdxabcd
运行它时,[abcd]+
首先匹配abcd
,然后x
匹配该文本x
,然后[abcd]+
匹配第二个abcd
现在您完全正确了,这些是单独的匹配,换句话说,如果您使用/^[abcd]+|x$/
作为正则表达式(注意锚定^
和$
),您会注意到这不匹配abcdxabcd
==========/(d|[abc])+|x/
这是一个完全不同的表达(d |[abc])+
匹配d
或[abc]
并捕获第1个捕获组内的任何匹配项,但由于+
的原因,此表达式会重复一次或多次,因此捕获组包含最后一个与其内部内容匹配的内容
因此,当您对abcdxabcd
运行此操作时,a
与[abc]
匹配,然后b
也与c
匹配,但是d
与d
匹配,这是整个组匹配的最后一件事(d|[abc])+
sod
是组匹配的值,因此匹配组1,即d
现在出现了与x
匹配的x
,该组未捕获任何内容,因此第二个捕获组为空组
现在,最后一个捕获组的工作方式与第一个捕获组相同,因此我们得到:{d}
、{}
和{d}
我可以继续一个接一个地解释其余的表达式,但这需要大量的打字。我希望你能看到这对其他人是如何起作用的
摘要:当一个组不匹配时,它会捕获空字符串(我不知道这是在Ruby代码中发生的,还是Rubular为了清晰起见才显示出来)。某个组捕获的最后一个内容是保留的内容,如果该组匹配多次,则先前捕获的内容将消失
编辑:捕获组只捕获或记住其内部的表达式所匹配的内容,因此您可以通过反向引用在正则表达式本身中引用它,也可以在替换字符串中引用它
啊哈,我忘了告诉你,捕获组从1开始编号,从左到右计数
让我给你看一个例子:如果你想匹配一个紧接着重复的字符,你可以使用:
(.)\1
匹配单个字符,()
捕获组1中匹配的内容,然后我们尝试使用称为反向引用的\1
匹配组1中匹配的内容
另一个示例:假设您希望匹配多个由破折号分隔的字符,类似这样:abc-53
,并且希望在替换字符串中引用它们
您将匹配:
([^-]+)-([^-]+)
([^-]+)
匹配一个或多个非破折号的字符-
,现在我们使用在替换字符串中捕获的内容,如下所示:
$2 == $1
这将导致将abc-53
转换为53==abc
捕获组和其他正则表达式功能的主题可能需要很多解释,您可以查看更多信息。您可以展示一些测试用例吗?为什么最后四项不起作用(即,它们与第一项的作用相匹配/不匹配)?乍一看,它们应该-在任何情况下,它们都应该匹配您的字符串
“abcdxabcd”
。a-d中的任何字符集都应该是一个匹配的一部分。字符x应该是另一个匹配的一部分。出现的任何其他字符都不应该匹配。您是否使用String#scan
来获取这些匹配项?我最终将在代码中使用String#scan
来解析字符串,但现在我只是使用Rubular来确保它能够工作。啊,是的,就像您之前所说的。好啊它看起来像是Rubular使用了scan
或类似的功能。你能详细介绍一下什么是捕获组以及它们是如何工作的吗?