如何在可选的非捕获组中创建两个捕获组。

时间:2014-06-11 14:23:13

标签: javascript regex regex-group

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

^#!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=addr1=的字符串不匹配(here)。

1 个答案:

答案 0 :(得分:0)

听起来像你正在寻找这个:

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

demo中,请参阅右下方窗格中的捕获组。

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