2014-01-19 163 views
0

這裏是文字的,我試圖執行一個正則表達式行:貪婪與非貪婪在Perl的正則表達式

"MATS"?"Base Revenue Element"?#Mi?#Mi 

這裏是我的正則表達式:

s/\?[^"]/FOUND/; 

我期望能獲得:

"MATS"?"Base Revenue Element"?FOUNDMi?FOUNDMi 

而是我得到:

"MATS"?"Base Revenue Element"?FOUNDMi?#Mi 

所以我把它切換到:

但現在我得到:

"MATS"FOUND"Base Revenue Element"?#Mi?#Mi 

所以:

  1. 爲什麼它只能執行一個查找,然後在該行停止的文字?
  2. 爲什麼添加非貪婪?使它找到第一個問號,即使它旁邊有一個雙引號?

回答

3
  1. 因爲s///只做一個替換默認。您可以使用g修改讓它做盡可能多的:s/\?[^"]/FOUND/g;

  2. 因爲?不是「非貪婪修改」以下的原子,它是「零或一」量詞。 \?[^"]?匹配一個問號可選後跟一個非引號字符;它會匹配「?」如果後面跟着一個引號,就是單獨的。貪婪實際上與這裏發生的事情無關。