【问题标题】:Start second match from offset of first match从第一场比赛的偏移量开始第二场比赛
【发布时间】:2014-10-24 05:12:47
【问题描述】:

我需要链接上一个匹配的最后一个偏移量的第二个匹配。想象一下,我有:

id, name

我将使用preg_match_all() 捕获idname(逗号分隔),所以我可以使用LIKE THIS

\s* (\w+) \s* (?:,|$)

它适用于我之前的示例。但如果我这样做:

invalid example

它将匹配example。而且我不想在这种情况下匹配,因为只有当所有数据都被某些东西匹配时我才需要接受(空格是我的正则表达式中不允许的组)。

为了解决这个问题,我应该可以使用行首锚,LIKE THIS

^ \s* (\w+) \s* (?:,|$)

所以我之前的示例现在将不匹配(这是正确的),但我的第一个示例将失败,因为 name 将不匹配,一旦它不匹配是行首。

示例

  • id 只需要匹配 id;
  • id, name需要匹配idname
  • will fail需要失败;
  • will, fail too 也需要失败;

More examples here..

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    您可以使用此正则表达式匹配所有输入,或者使用, 或使用preg_match_all 函数结束输入:

    [^,] +.*$(*SKIP)(*F)|(\w+)(?=(?:, \w+)*$)
    

    RegEx Demo

    【讨论】:

    • 对我来说不可行,因为我有一些组,我需要捕获有关每个匹配部分的一些信息。
    • 没有得到您的评论,提供的答案有什么不可行的?
    • Check it,这是我目前的正则表达式。我捕获了很多命名组来设置对象的一些属性(对于每个匹配的项目)。
    • @anubhava 似乎OP想在这里使用\G 来捕获所有匹配项,但不清楚。
    • 嗯,命名组只能使用有限的输入集。如果您的输入是foo, bar, baz, abc, xyz, pqr 怎么办?您的输入是否只能包含 1 个或 2 个或 3 个由 , 分隔的元素?
    猜你喜欢
    • 2022-11-23
    • 2022-01-08
    • 1970-01-01
    • 2012-03-27
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多