簡體   English   中英

PHP preg_match-正則表達式意外貪婪

[英]PHP preg_match - regex is unexpectedly greedy

我正在嘗試將一系列字符分隔成一串隔開的字母。 以下是一些示例:

  • “ abcde”
  • “加德”
  • “是”
  • “ bce”
  • “ efg”

我希望它與任何與“ e”匹配的東西,但我也希望兩個結果用於反向引用。 如果找到“ b”,則它應該是第一個反向引用,第二個應該是“ b”和“ e”之間的任何值。 如果沒有“ b”,則第二個反向引用是什么都沒關系。 這是我的測試代碼:

$regex = "( b)?( .*)?? e ";

preg_match("/{$regex}/", " a b c d e ", $matches);

這將返回$ matches“”(無)和“ abcd”。 但是,如果我刪除前面的空間,它將按我想要的方式工作:

preg_match("/{$regex}/", "a b c d e ", $matches);

這將返回$ match的“ b”和“ cd”。 答對了! 但是我需要在干草堆字符串中有該初始空間。 我以為(b)? 會因為? 最后,並期望(。*)?? 懶惰。 但是它更喜歡惰性(。*)? 超過它。

幾乎正則表達式的首要任務是從字符串的開頭開始匹配,然后只有THEN才考慮貪婪/懶惰。 這是真的?

這是一個演示

在真實的,非簡化的正則表達式中,可以有多個(b)嗎? 字符串,實際上每個復雜字符串都是數十個字符的正則表達式,因此在(。*)??中使用否定是不可行的。

我真正想了解的是-我希望第一和第二組都是可選的。 我希望第一組是貪婪的,第二組是貪婪的。 當前,第二組將覆蓋第一組,因為它可以在字符串中更早地匹配。

有沒有辦法修改正則表達式來完成我所需要的?

您可以使用以下正則表達式:

( b)?((?:(?!b).)*)? e 

觀看演示

關鍵是第二個組不能匹配b ,否則它將始終“覆蓋”第一個可選組。

暫無
暫無

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

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