【问题标题】:Regex not matching the first occurence of my string正则表达式与我的字符串的第一次出现不匹配
【发布时间】:2015-05-12 02:51:24
【问题描述】:

在这个网址中:

 http://example.com/SearchResult-Empty.html?caty[]=12345&caty[]=45678

我正在尝试使用以下正则表达式来获取 caty 的第一次出现,它应该是“12345”。然而,相反,下面的正则表达式给了我最终出现的 45678。我尝试使用“?”限制器使其对其他堆栈溢出问题不贪婪,但它不起作用。我该怎么做?

 ^SearchResult(?:.*)(caty)(?:.*)\=([0-9]+)\&?$

【问题讨论】:

  • @Ghost:对不起,我有点脑残……不应该说这是 PHP。其实是htaccess...
  • 哦,好吧,我从没想到它的上下文是在 htaccess 上
  • SearchResult(?:.*?)(caty)(?:.*?)\=([0-9]+)\&? 应该可以正常工作
  • 不,@vihan1086 还是一样的:regex101.com/r/lC5rU7/1
  • @CRAIG 似乎 ^ 和 $ 搞砸了你:SearchResult(?:.*?)(caty)(?:.*?)\=([0-9]+)\&? regex101.com/r/lC5rU7/2

标签: regex .htaccess url-rewriting


【解决方案1】:

据我所知,有两件事让您感到困惑:

  • 锚点 ^ 和 $ 似乎迫使正则表达式产生错误匹配
  • 您正在使用贪婪的.* 而不是非贪婪的.*?
SearchResult(?:.*?)(caty)(?:.*?)\=([0-9]+)\&?

应该做的工作

【讨论】:

  • 感谢@vihan1086 答案的更多细节! :)
  • @CRAIG 没问题 :) $ 基本上反转 non-greedy 选项的效果使得正则表达式引擎决定是否听non-greedy $
【解决方案2】:
^SearchResult(?:.*)(caty)(?:.*)\=([0-9]+)\&?$
                ^^

.* 是贪心匹配,这意味着它将去caty 的最后 次出现,而不是第一次出现。您可以通过在输入字符串中提供 三个 caty's 来检查它,然后它将跳过前 两个。

.*? 使其不贪婪(又名不情愿),这将尽可能少地消耗来进行匹配 - 在@987654326 的第一次 出现处停止@。

【讨论】:

  • 对@paxdiablo 但如果我在^SearchResult(?:.*?)(caty)(?:.*?)\=([0-9]+)\&?$ 之后添加一个问号以使其不贪婪,它不会有什么不同吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2016-09-28
  • 2022-08-13
  • 2016-03-18
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多