【问题标题】:How to make an two capturing groups inside a optional non capturing group.如何在可选的非捕获组中创建两个捕获组。
【发布时间】:2014-08-01 15:47:04
【问题描述】:

所以我有这个正则表达式,它是我想要的近似值:

^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)\/coord0=(.*)\/coord1=(.*)

当我传递这个字符串时:

#!addr0=one/addr1=two/coord0=three/coord1=four

它正确捕获:onetwothreefour,请参阅here

问题是我希望能够捕获以下字符串:

#!addr0=one/addr1=two

这应该捕获:onetwo

并且可选地,字符串也可以包含(尽管我可以保证addr0=addr1= 会在那里):

/coord0=three/coord1=four

据我所知,我需要一个可选的非捕获组,所以我想到了这个:

^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)(?:\/coord0=(.*)\/coord1=(.*))?

这不起作用,因为这些组是:onetwo/coord0=three/coord1=four

(see it here)

我猜这很接近,因为当我不把问号放在最后时,我得到:onetwothreefour 但字符串只有 addr0= 和 @ 987654344@ 不匹配 (here)。

【问题讨论】:

  • 也许检查非斜线? ^#!addr0=(.*?)(?=\/addr1=)\/addr1=([^/]*)(?:\/coord0=([^/]*)\/coord1=([^/]*))?
  • @user887675 问题是我真的不能在第二个地址上有一个带有斜线的地址......
  • 仅供参考,添加了解释。 :)

标签: javascript regex regex-group


【解决方案1】:

听起来你在找这个:

^#!addr0=(.*?)\/addr1=([^/]*)(?:\/coord0=(.*)\/coord1=(.*))?

demo 中,查看右下方窗格中的捕获组。

  1. 原始文件的一个问题是前瞻 (?=\/addr1=) 是多余的,因为您总是匹配 /address1
  2. 对于第 2 组,我们使用否定字符类 [^/]*,而不是懒惰的贪婪 .*?。为什么?因为由于最后一部分是可选的,所以懒惰的.*? 会被允许过早放弃。
  3. 最后一部分进入非捕获组(?: 并设为可选。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2017-08-03
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多