首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP正则表达式中,这种反向引用条件是如何工作的?

在PHP正则表达式中,这种反向引用条件是如何工作的?
EN

Stack Overflow用户
提问于 2021-04-20 12:56:29
回答 2查看 92关注 0票数 1

我的要求如下:

  1. 如果字符串包含单词"cat",则必须与"cat“匹配。
  2. 然而,如果“猫”一词前面有“狗”一词,那么“猫”也必须被“狗”所取代,所有三个词都必须匹配。
  3. 这意味着字符串“狗猫”不能匹配,因为第二个“狗”是不存在的。

因此,我用PHP编写了以下正则表达式。它包含一个反向引用条件:

代码语言:javascript
复制
      $ptn = '@' .                    // PHP delimiter
             '(dog\s*)?' .            // dog
             'cat\s*' .               // cat
             '(?(1)dog)' .            // backreference cond
             '@';                     // PHP delimiter

该regex符合要求1:

代码语言:javascript
复制
     $str1b = 'cat';
     preg_match($ptn, $str1b, $matches);
     print_r($matches);

交单的目的是:

数组( => cat )

该regex还满足要求2:

代码语言:javascript
复制
     $str1a = 'dog cat dog';
     preg_match($ptn, $str1a, $matches);
     print_r($matches);

交单的目的是:

阵列( =>狗猫狗1 =>犬)

但是,我想问为什么数组包含两个元素?是因为正则表达式有两个消耗子表达式吗?

关于需求3,下面的数据测试它:

代码语言:javascript
复制
      $str1c = 'dog cat';
      preg_match($ptn, $str1c, $matches);
      print_r($matches);

这里的运单是:

数组( => cat )

在这里,我想问:

  1. 为什么“猫”匹配?因为它前面有“狗”,所以它也应该被“狗”所取代,这将导致一场比赛,否则不应该发生匹配。
  2. 这是regex应该怎么工作的吗?
  3. 怎样才能达到我的3项要求?

这是代码

我只考虑用PHP来解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2021-04-20 17:11:18

然而,如果"cat“一词前面有”狗“一词,那么"cat”也必须被“狗”所取代,这三个词都必须匹配。

TheFourthBird使用PCRE有一个很好的答案

根据我的解释,这个准则也适用于你:

代码语言:javascript
复制
\b(?:dog cat dog|(?<!\bdog )cat)\b

RegEx详细信息:

  • \b:字界
  • (?::启动非捕获组
    • dog cat dog:Match dog cat dog
    • |
    • (?<!\bdog )cat:如果前面没有单词dog和空格,则匹配cat

  • ):端非捕获组
  • \b:字界
票数 2
EN

Stack Overflow用户

发布于 2021-04-22 08:45:22

这是一个使用标准语法的解决方案

它与“狗猫”和“猫”相匹配,而不是“狗猫”。

我无法在这里发布正则表达式,因为它声称没有正确地缩进(尽管它是)。请查看正则表达式的链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67179408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档