2011-03-31 43 views
2

如何使用積極的後視圖來匹配超過1次使用貪婪+正則表達式 - 積極向後看問題

這工作:

(?<=\w)\w+ 

但我需要匹配所有\ W類似於:

(?<=\w+)\w+ 

的語法錯誤是在第二個例子,這是行不通的。

如何製作積極的lookbehind匹配多次出現?

+2

你究竟在做什麼? – Gumbo 2011-03-31 18:02:51

+2

您正在討論_variable length lookbehind_。很少有正則表達式引擎支持這一點。 .NET和JGSoft引擎是我所知道的唯一的引擎。我會重複甘博所問的......你需要匹配什麼? – ridgerunner 2011-03-31 19:33:49

+0

感謝您的評論 - 我正在嘗試構建一個匹配短語而不僅僅是單個單詞的標籤雲。可變長度lookbehind是比較一個字符串在整個字符串中的不同位置。 – Kit 2011-03-31 19:43:55

回答

2

你可能只是想沒有任何lookbehinds匹配,然後使用您的捕獲組:

if (preg_match('~[abc]+([cde]+)~', $string, $matches)) { 
    echo $matches[1]; // will contain the [cde]+ part 
} 
3

一個非常骯髒的方式做到這一點,是扭轉字符串,並使用正前瞻代替。這是我在JavaScript中使用(支持有沒有lookbehinds :()一招

所以必須做這樣的事情:

$string = 'This is a long string that must show this is what will happen'; 
$str_rev = strrev($string); 

if (preg_match('!(si)(?=\w+)(\w+)!i', $str_rev, $matches)) { 
    print_r($matches); 
} 

上面的代碼將匹配本的出現字符串中,第二\ w +是隻是爲了顯示它匹配,並在你的例子是沒有必要的。

請記住,這種技術只可能在你使用greedines只有一個方向對於Lookbehind/aheads(例如你不能在\ w +和\ w +一起使用向後追逐)

+0

非常有趣。 – sawa 2011-03-31 19:24:04

2

對不起,但是在lookbehinds中沒有量詞!

我發現這個在perlretut

先行(?=正則表達式)可以匹配 任意正則表達式,但是回顧後 (?< =固定的regexp)僅適用於固定的寬度

的 正則表達式

我認爲這也適用於PHP的正則表達式引擎。