簡體   English   中英

為什么非貪婪匹配會消耗整個模式,即使后面跟着另一個非貪婪匹配

[英]Why is non-greedy match consuming entire pattern even when followed by another non-greedy match

使用 PHP8,我正在努力弄清楚如何有條件地匹配一些可能出現或不出現在字符串中的鍵。 我想匹配兩者

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

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

破折號(“-”)可以是任何非空格字符,此處僅用於更清晰的示例。

如果正則表達式的包含組像下面這樣貪婪,則正則表達式匹配“key=...”。 但這還不夠,因為完整匹配將失敗,因為“key=xyz”缺少主題字符串。

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

如果該捕獲組是非貪婪的,則正則表達式將忽略任何“key=xyz”的鍵匹配

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

我嘗試在此regex101 示例中進行調試,但無法弄清楚。

我使用多個正則表達式解決了這個問題,但希望有人能幫助解決我的誤解,這樣我就知道如何使它作為一個正則表達式工作。 謝謝

您可以使用:

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

正則表達式演示

正則表達式細分:

  • ^ : 開始
  • \S*? : 非貪婪匹配0個或多個空格
  • (?: : 開始前瞻
    • key=(?<foundkey>\w+) :匹配key= text 后跟 1+ word 字符作為捕獲組foundkey
    • \S* :匹配 0 個或多個空格
  • )? : 結束前瞻。 ? 使其成為可選匹配項
  • $ ; 結尾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM