php 为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配

cigdeys3  于 2023-01-16  发布在  PHP
关注(0)|答案(1)|浏览(119)

使用PHP 8时,我一直在努力弄清楚如何有条件地匹配某个可能出现在字符串中也可能不出现的键。

-----------key=xyz---------------

以及

--------------------------

破折号(“-”)可以是任何非空格字符,此处仅用于更清晰的阅读示例。
正则表达式匹配“key=...”,如果它的包含组是贪婪的,如下所示。但这是不够的,因为完全匹配将失败,因为“key=xyz”缺少主题字符串。

/
(\S*)?                 
(key\=(?<foundkey>[[:alnum:]-]*))
\S*
/x

如果捕获组是非贪婪,则正则表达式将忽略与任何“key=xyz”匹配的键

/
(\S*)?                 
(key\=(?<foundkey>[[:alnum:]-]*))?
\S*
/x

我试着在这个regex101 example中调试,但无法解决它。
我使用多个正则表达式整理了这个,但是希望有人能帮助解决我的误解,这样我就知道如何使这个作为一个正则表达式工作。谢谢

nuypyhwy

nuypyhwy1#

您可以使用:

/
^
\S*?
(?:
   key=(?<foundkey>\w+)
   \S*
)?
$
/xm

RegEx Demo

    • RegEx细分:**
  • ^:开始
  • \S*?:匹配0个或多个非贪婪空格
  • (?::开始预读
  • key=(?<foundkey>\w+):匹配key=文本(后跟1+单词字符)作为捕获组foundkey
  • \S*:匹配0个或多个空格
  • )?:结束前瞻。?使其成为可选匹配
  • $;结束

相关问题