【问题标题】:greedy character matching at end of string字符串末尾的贪婪字符匹配
【发布时间】:2013-11-22 13:11:15
【问题描述】:

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

controller1/action1/something

使用以下正则表达式:

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

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

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

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

所以当字符串为:controller1/action1/时也应该成功

那么为什么它不能与(.*)(.*?) 一起使用而与.+ 一起使用呢?区别应该只是第一个说“零个或多个字符”,最后一个说“一个或多个”。我只是想检查“零个或多个”。

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

【问题讨论】:

  • 看起来对我有用:Demo
  • 它也适用于我,Another Demo
  • 也许发布您的 PHP 代码,以及您正在测试的完整输入字符串的示例

标签: php regex preg-match pcre


【解决方案1】:

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

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

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

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

【讨论】:

  • 我以为他/她专门要求没有^$的解决方案
  • 我给出的例子正是我在测试中使用的。但是您的正则表达式似乎工作正常,谢谢。
【解决方案2】:

您只需将最后一组设为可选即可使其匹配 controller1/action1/

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

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多