【问题标题】:Why is this greedy operator ? being generous为什么是这个贪婪的运营商?大方
【发布时间】:2019-12-23 15:02:08
【问题描述】:

我的正则表达式是:

/((\&sll\=|@)(?<latitude>-?\d{1,3}\.\d*),(?<longitude>-?\d{1,3}\.\d*))?/

我想匹配以下所有 3 个字符串:

http://maps.google.com/maps?f=q&hl=en&geocode=&time=&date=&ttype=&q=21421+N.+Mdddoe+St.+Moickoe,+MI+48162&sll=77.070743,-23.1193&sspn=0.030456,0.033474&ie=UTF8&t=k&z=16&iwloc=addr&om=1
https://www.google.com/maps/place/173s10+N+Ladddel+ddddk+Dr,+Lddddd+sssss+Place,+Lfadfss,+MI+48152/@43.4353453,-45.4166187,848m/data=!3m2!1e3!4b1!4m2!3m1!1s0x8824b2772a3b2b7f:0x677087e29a57bf25?hl=en
https://www.google.com/maps/dir//57+bbbbb+Street,+adasfsf,+CT+02424

在前 2 个的情况下,经纬度命名组应该具有纬度和经度值,在第 3 个的情况下,正则表达式应该返回一个匹配项,但命名组应该是未定义的。

如果我删除 ? 一次或无运算符,它将匹配前 2 个并且具有正确的纬度和经度值。显然不会匹配第三个。另一方面,? 匹配所有三个但不填充命名组。

我怎样才能得到我想要的结果?为什么在整个东西周围加上? 不意味着匹配它,如果它在那里,如果没有,不要?

【问题讨论】:

  • 1.使用 this kind of trick to parse url 和基本代码是 IMO 从更优雅地获得你想要的东西。 2. Javascript 中不存在命名捕获(除非您使用 XRegExp 库)。 3.&amp;=不是正则表达式中的特殊字符,不需要转义。
  • 1.对于一次性抓住快速纬度,经度来说,这太过分了。但是,无论如何,谢谢。 \n 2. Node.js 10 及更高版本已命名捕获。 3.啊!
  • 不管怎样,我想多了,因为最好的办法就是单独匹配它们,并在获取组属性之前检查是否匹配...

标签: javascript regex regex-group regex-greedy


【解决方案1】:

嗯,我自己想通了。

首先,要获得我想要的结果,只需使用全局选项。见这里:https://regex101.com/r/x9kr3R/1 它匹配每一个字符,但命名的组也被填充,所以我可以把它们读出来。

然后,这就解释了为什么它不能以其他方式工作,因为它已经在第一个字符处找到了匹配项,它不会继续查找将满足 ? 组的匹配项。所以贪婪意味着局部贪婪而不是全局贪婪是一种思考方式......也就是说,当找到第一个匹配时,在该匹配的上下文中,它是贪婪的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2011-09-01
    • 2015-01-07
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多