我试图匹配从最后一次出现的关键字(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
)
*/
注意我关注如何执行此操作的理论和推理,请在相关说明中添加一些说明或链接。
答案 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?'