我正在尝试匹配以下字符串:
controller1/action1/something
使用以下正则表达式:
(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.*)
由于某种原因,它找不到字符串的最后部分:something
。但是当我在正则表达式的末尾将*
更改为+
时,它会起作用:
(?P<controller>[[:alnum:]]+)/(?P<action>[[:alnum:]]+)/(.+)
使用该正则表达式,它确实找到了something
字符串。但是我想使用.*
(或.*?
),因为我希望这个正则表达式在最终没有东西时也能成功。
因此,当字符串为:controller1/action1/
那么为什么它不适用于(.*)
或(.*?)
,但适用于.+
?差别应该只是第一个表示“零个或多个字符”而最后一个表示“一个或多个”。我只是想检查“零或更多”。
PS。由于更复杂的问题,我不想使用^
和$
来表示字符串的开头和结尾。简单地说,最终字符串并不总是出现这种模式。
答案 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:]]+)/(.+)?