我的正则表达式应匹配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]} 我并不完全熟悉匹配组的概念,这是我的问题的一部分。我的目标不是要找到一个有效的表达方式,以便理解这些案例之间的差异,并理解那些不起作用的案例实际上在做什么。
答案 0 :(得分:0)
========= /[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])+
匹配的最后一件事,因此d
是该组匹配的值,因此匹配组1 {{1} }}
现在d
与x
匹配,并且该组没有捕获任何内容,因此第二个捕获组是空的。
现在最终捕获组的工作方式与第一个捕获组的工作方式相同,因此我们得到:x
,{d}
和{}
。
我可以继续逐一解释其余的表达式,但这需要大量输入。我希望你能看到其他人如何运作。
摘要:当一个组不匹配时,它会捕获空字符串(我不知道这是否真的发生在Ruby代码中,或者它只是由Rubular显示清晰度)。某个组捕获的最后一件事是保持打开状态,如果该组匹配多次,之前的捕获将会消失。
编辑:捕获组只是捕获或记住它内部的表达式匹配的内容,因此您可以通过后引用在正则表达式中引用它或在替换字符串中引用它
啊哈我忘了告诉你,捕获组从1开始编号,从左到右计数。
让我举个例子:如果你想匹配一个自己重复的角色,你可以使用:
{d}
(.)\1
匹配单个字符,.
捕获组1中匹配的内容,然后我们尝试使用()
匹配与组1匹配的相同内容后面的参考。
另一个例子:假设您要匹配另外一个由短划线分隔的字符,如下所示:\1
并且您希望在替换字符串中引用它们。
你会匹配:
abc-53
([^-]+)-([^-]+)
匹配一个或多个不是短划线([^-]+)
的字符,现在我们使用在替换字符串中捕获的内容,如下所示:
-
这会将$2 == $1
转换为abc-53
。
捕获群组和其他正则表达式功能的主题可能需要大量解释,您可以查看regular-expressions.info以获取更多信息。