【问题标题】:Regex: Match from character to end of line without the last match group正则表达式:从字符匹配到行尾,没有最后一个匹配组
【发布时间】:2014-12-28 07:59:42
【问题描述】:

我想从一些 url 中提取 q 参数:

.com/?gws_rd=ssl#q=test
.com/search?q=something+else&source=123

这是我想出的一个正则表达式:q=(.*?)(&|$)。当&终止时,结果是:

["q=test", "test", "&"]

否则,当它到达行尾时:

["q=test", "test", ""]

这可行,但似乎不正确。

有没有办法完全不包括最后一个匹配组,因为我对它不感兴趣?

【问题讨论】:

  • ... 为什么不将您的正则表达式更改为 /q=(.*?)[&|$]/ ?您不希望与 &|$ 匹配,而是希望将它们作为一个整体进行评估。
  • @TheIronDeveloper 与第一个 url 不匹配
  • @Thelron [&|$] 会超出你的假设。
  • 你是对的,管道在那里没有意义。这是一个更好的正则表达式,对两者都有效:/q=([^&]*)/。我仍在评论的唯一原因是前瞻正则表达式性能不佳。
  • @TheIronDeveloper 很有趣,并适当地注意到了。

标签: javascript regex uri


【解决方案1】:

将最后一组转换为积极的前瞻断言。

(?=&|$) 断言匹配必须后跟& 或行尾锚$

q=(.*?)(?=&|$)

DEMO

> ".com/?gws_rd=ssl#q=test".match(/q=(.*?)(?=&|$)/)
[ 'q=test',
  'test',
  index: 17,
  input: '.com/?gws_rd=ssl#q=test' ]

仅打印捕获组内的字符。

> var s = ".com/?gws_rd=ssl#q=test"
undefined
> console.log(/q=(.*?)(?=&|$)/.exec(s)[1]);
test

【讨论】:

  • 这行得通,谢谢。有没有办法阻止 JS 也包含第一个捕获组?意思是,只看到['test']
  • 是的,我知道如何从结果数组中取出它,我只是好奇为什么 JS 包含第一个匹配 q=test 而不仅仅是结果。我想它的意思是“这是匹配的,这就是结果”-访问可能为空的数组时我有点不安
  • js 打印匹配 q=test 以及捕获 test。匹配在索引 0 处,捕获在索引 1 处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2019-04-17
  • 2012-05-09
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多