RegEx - 正面观察问题

时间:2011-03-31 17:20:54

标签: php regex

如何使用贪婪的+使用积极的后视来匹配多个事件?

这有效:

(?<=\w)\w+ 

但我需要匹配所有\ w类似于:

 (?<=\w+)\w+ 

第二个示例中的语法错误,但不起作用。

如何在多次出现时进行积极的后视匹配?

3 个答案:

答案 0 :(得分: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);
}

上面的代码会在字符串中出现 THIS 时匹配 。第二个 \ w + 只是为了显示匹配的位置,在您的示例中不需要。

请记住,只有当你只使用一个方向来获得Lookbehind / aheads的贪婪时才能使用这种技术(例如你不能使用带有\ w +的lookbehind和带有\ w +的前瞻)

答案 1 :(得分:2)

您可能只想匹配它而没有任何外观,然后使用您的捕获组:

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

答案 2 :(得分:2)

很抱歉地说,但是看起来没有量词!

我在perlretut

中找到了这个
  

Lookahead(?= regexp)可以匹配   任意的正则表达式,但是看起来很好   (?&lt; = fixed-regexp)仅适用于   固定宽度的正则表达式

我认为这对php正则表达式引擎也有效。