【问题标题】:Regex not being greedy enough正则表达式不够贪婪
【发布时间】:2011-03-04 00:32:12
【问题描述】:

我有以下正则表达式,它在出现新情况之前运行良好

^.*[?&]U(?:RL)?=(?<URL>.*)$

基本上,它用于 URL,抓取 U= 或 URL= 之后的所有内容并在 URL 匹配中返回它

所以,对于以下

http://localhost?a=b&u=http://otherhost?foo=bar

网址 = http://otherhost?foo=bar

不幸的是,出现了一个奇怪的案例

http://localhost?a=b&u=http://otherhost?foo=bar&url=http://someotherhost

理想情况下,我希望 URL 为“http://otherhost?foo=bar&url=http://someotherhost”,而不是“http://someotherhost

编辑:我认为这解决了它......虽然它不漂亮

^.*[?&](?<![?&]U(?:RL)?=.*)U(?:RL)?=(?<URL>.*)$

【问题讨论】:

  • 哦,讽刺的是......你的问题说“不够贪婪”,而问题是由.*太贪婪引起的:)
  • @MvanGeest,是的,我忘了 .* 会很贪婪,我一直试图让另一半“更贪婪”……我从来没有想过 .* 是问题所在。

标签: regex language-agnostic regex-greedy


【解决方案1】:

问题

问题不在于.*不够贪心;就是前面出现的other.*也是贪心的。

为了说明这个问题,让我们考虑一个不同的例子。考虑以下两种模式;它们是相同的,除了在第二种模式中不情愿\1

              \1 greedy, \2 greedy         \1 reluctant, \2 greedy
              ^([0-5]*)([5-9]*)$           ^([0-5]*?)([5-9]*)$

这里我们有两个捕获组。 \1 捕获 [0-5]*\2 捕获 [5-9]*。以下是这些模式匹配和捕获的内容的并排比较:

              \1 greedy, \2 greedy          \1 reluctant, \2 greedy
              ^([0-5]*)([5-9]*)$            ^([0-5]*?)([5-9]*)$
Input         Group 1    Group 2            Group 1    Group 2
54321098765   543210     98765              543210     98765
007           00         7                  00         7
0123456789    012345     6789               01234      56789
0506          050        6                  050        6
555           555        <empty>            <empty>    555
5550555       5550555    <empty>            5550       555

请注意,像\2 一样贪婪,它只能抢到\1 没有先抢到的东西!因此,如果你想让\2 尽可能多地抢到5,你必须让\1 不情愿,所以5 实际上是由\2 抢夺的。

附件

相关问题


修复

因此,将此应用于您的问题,有两种方法可以解决此问题:您可以使第一个 .* 不情愿,所以 (see on rubular.com):

^.*?[?&]U(?:RL)?=(?<URL>.*)$

或者,您可以完全去掉前缀匹配部分 (see on rubular.com):

[?&]U(?:RL)?=(?<URL>.*)$

【讨论】:

  • 不情愿?我通常称之为非贪婪。所以确实,第一个.*太贪心了。
  • @MvanGeest:我通过 Java 学习了正则表达式,这就是他们所说的 (java.sun.com/docs/books/tutorial/essential/regex/quant.html)。
  • @polygenelubricants:好的,我在 Perl 中遇到了正则表达式,学习 Perl 使用非贪婪。它也在一个非常古老的 Perl 常见问题解答中:perl.com/doc/FAQs/FAQ/oldfaq-html/Q1.3.html 但是,是的,谁在乎它们叫什么? (当然是一个拼命搜索网络的人......)
  • 很好的编辑和进一步的解释,如果可以的话,我会再次投票并接受这个答案
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多