匹配两个单词之间的所有内容,而匹配的最后一个单词是可选的


matching everything between two words, while last word being matched is optional

我需要捕获"一"answers"四"之间的所有内容,"四"是可选的。我们不知道"一"answers"四"之间是什么。我试着匹配它,但没有得到正确的结果。我做错了什么?

$text = "one two three four five six seven eight nine ten";
preg_match("~one( .+)(four)?~i", $text, $match);
print_r($match);

结果:

Array ( [0] => one two three four five six seven eight nine ten [1] => two three four five six seven eight nine ten )

需要结果:

Array ( [0] => one two three four five six seven eight nine ten [1] => two three [3] => four)

附言:是的,"四个"必须是可选的。

这里需要使用交替运算符。

one(( .+)(four).*|.*)

演示

默认情况下,重复运算符(如"?"、"*"、"+"或{n,m})是贪婪的,它们会尽可能多地匹配符号。你可以在这里阅读更多关于懒惰和贪婪的内容:在正则表达式的上下文中,懒惰和贪婪是什么意思?

为了让他们不贪婪,在他们后面加上"?"。像这样:"~一(.+?)(四)?~i"