代码之家  ›  专栏  ›  技术社区  ›  noah

同一正则表达式中的两个贪婪量词

  •  4
  • noah  · 技术社区  · 6 年前

    如果结构的字符串未知:

    "stuff I don't care about THING different stuff I don't care about THING ... THING even more stuff I don't care about THING stuff I care about"

    我想捕捉“我在乎的东西”,这将永远是在最后一件事情发生之后。事物有可能出现0次或多次。如果出现0次,那么就没有我关心的东西。这根弦不能以事物开头或结尾。

    一些可能的字符串:

    "stuff I don't care about THING stuff I care about"

    "stuff I don't care about"

    一些不可能的字符串:

    "THING stuff I care about"

    "stuff I don't care about THING stuff I don't care about THING"


    我目前解决这个问题的方法是使用带有两个贪婪量词的regex,如下所示:

    if( /.*THING(.*)/ ) {
        $myStuff = $1;
    }
    

    这似乎是可行的,但我的问题是这两个贪婪的量词将如何相互作用第一个(最左边的)贪婪量词总是比第二个“更贪婪”吗?

    基本上,我保证不会像下面这样被拆分:

    "stuff I don't care about THING"

    $1 = "different stuff I don't care about THING even more stuff I don't care about THING stuff I care about"

    与我想要的分割相比:

    "stuff I don't care about THING different stuff I don't care about THING even more stuff I don't care about THING"

    "stuff I care about"

    3 回复  |  直到 6 年前
        1
  •  10
  •   tripleee    6 年前

    Regex返回最长的最左边匹配项。第一个通配符最初将匹配到行尾,然后一次连续回溯一个字符,直到regex的其余部分产生匹配,即最后一个 THING 在字符串中是匹配的。

        2
  •  3
  •   Borodin    6 年前

    在匹配过程中, .*THING 最初将匹配所有内容,包括 最后的 发生 THING

    如果其他模式无法匹配 ,它会 回溯 变短,把所有的东西都匹配起来,包括 倒数第二 发生 事情 ,然后再次尝试其他模式

    然而,其余的模式是 .* 哪个会 总是 匹配,因为它将匹配空字符串

    因此, .*THING(.*) 将匹配并包括 最后的 发生 事情 ,将匹配并捕获字符串的其余部分

    注意 那个 . 将匹配除换行符以外的任何内容。如果文本中可能有换行符,则您将要使用 /s 使其完全匹配任何内容的修饰符

    也请注意 如果模式不匹配(因为 事情 在字符串中)然后 $1 将保持不变。它仍然包含最近成功的模式匹配设置的任何内容。这意味着你 必须 在使用值之前检查模式匹配的状态 1美元

        3
  •  0
  •   Chris Charley    6 年前

    这是我要的。

    /^(?!THING).+THING((?:(?!THING).)+)$/

    接受具有一个或多个THING匹配项的字符串东西不能在字符串的开头或结尾它在最后一次出现后获取文本。

    编辑: 在字符串开头添加了“THING”检查。

    编辑: 哇,重读你的说明书(我真的看错了)你说过 如果出现0次,那么就没有我关心的东西。这根弦不能以事物开头或结尾。

    那你的regex就没事了。 tripleee 很好地解释了情况。