正则表达式匹配任何关键字的最后一次出现的所有内容

时间:2011-03-26 03:29:16

标签: regex preg-match

我试图匹配从最后一次出现的关键字(foo或bar)到字符串结尾的所有内容。

示例(a):

// I want to match ' foo do you?';
$source = 'This is foo and this is bar i like foo do you?';
$pattern = '/pattern/';
preg_match($pattern, $source, $matches);

我尝试了以下内容:

$pattern = '/( (foo|bar) .*)$/';

认为它会匹配foo的最后一次出现以及以下所有文字,但它会匹配第一次出现。

print_r($matches);

/*
Array
(
    [0] =>  foo and this is bar i like foo do you?
    [1] =>  foo and this is bar i like foo do you?
    [2] => foo
)
*/

注意我关注如何执行此操作的理论和推理,请在相关说明中添加一些说明或链接。

2 个答案:

答案 0 :(得分:4)

.+((foo|bar).+)$

。+预先匹配许多角色。

((foo | bar)匹配并捕获您的关键字。

。+)匹配并捕获许多字符。

$匹配字符串/行的结尾。

使用您的示例:

This is foo and this is bar i like foo do you?
                                   ^---------^

答案 1 :(得分:2)

在模式前使用贪婪的比赛尽可能多地消耗大海捞针:

>>> import re
>>> source = 'This is foo and this is bar i like foo do you?'
>>> pattern = '.*((?:foo|bar).*)'
>>> re.search(pattern, source).groups()[0]
'foo do you?'

这种做法的方法是使用负面预测:

>>> # Negative look-ahead for the pattern: (?!.*(?:foo|bar))
>>> pattern = '((?:foo|bar)(?!.*(?:foo|bar)).*)'
>>> re.search(pattern, source).groups()[0]
'foo do you?'