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

  • 本文关键字:贪婪 另一个 模式 php regex
  • 更新时间 :
  • 英文 :


使用PHP8,我正在努力找出如何有条件地匹配一些可能出现或可能不出现在字符串中的键。我想匹配两个

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

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

破折号("-")可以是任何非空格字符,仅在这里用于更清晰地阅读示例。

正则表达式匹配"key=…"如果它的包含群是贪婪的,如下所示。但这是不够的,因为完全匹配会失败。缺少主题字符串。

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

如果捕获组不是贪心的,那么正则表达式就忽略键匹配任何"key=xyz">

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

我试着在这个regex101示例中调试,但无法找出它。

我整理了这个使用多个正则表达式,但希望有人可以帮助解决我的误解,所以我知道如何使这个工作作为一个单一的正则表达式。由于

您可以使用:

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

RegEx演示

正则表达式分解:

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

最新更新