字符串末尾的贪婪字符匹配

时间:2013-11-22 13:11:16

标签: php regex preg-match pcre

我正在尝试匹配以下字符串:

controller1/action1/something

使用以下正则表达式:

(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.*)

由于某种原因,它找不到字符串的最后部分:something。但是当我在正则表达式的末尾将*更改为+时,它会起作用:

(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.+)

使用该正则表达式,它确实找到了something字符串。但是我想使用.*(或.*?),因为我希望这个正则表达式在最终没有东西时也能成功。

因此,当字符串为:controller1/action1/

时,它也应该成功

那么为什么它不适用于(.*)(.*?),但适用于.+?差别应该只是第一个表示“零个或多个字符”而最后一个表示“一个或多个”。我只是想检查“零或更多”。

PS。由于更复杂的问题,我不想使用^$来表示字符串的开头和结尾。简单地说,最终字符串并不总是出现这种模式。

2 个答案:

答案 0 :(得分:0)

  

So it should also succeed when the string is: controller1/action1/

我怀疑,因为这个输入是一些更大的字符串的一部分,这就是.*不适合你的原因。建议您发布输入文本的一些真实示例。

同时你可以试试这个正则表达式:

"#(?P<controller>[^/]+)/(?P<action>[^/]+)/([^/]*)#"

答案 1 :(得分:0)

您必须使最后一组可选,以使其与controller1/action1/

匹配
(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.+)?