Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 括号分组如何影响正则表达式结果?_Ruby_Regex - Fatal编程技术网

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])+
    so
    d
    是组匹配的值,因此匹配组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
    或类似的功能。你能详细介绍一下什么是捕获组以及它们是如何工作的吗?