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

Javascript 如何在可选的非捕获组中创建两个捕获组。,javascript,regex,regex-group,Javascript,Regex,Regex Group,我有一个正则表达式,它近似于我想要的: ^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)\/coord0=(.*)\/coord1=(.*) 当我传递此字符串时: #!addr0=one/addr1=two/coord0=three/coord1=four 它正确地捕获了:1、2、3和4,请参见 问题是我希望能够捕获以下字符串: #!addr0=one/addr1=two 这应该包括:一和二 字符串也可以包含可选内容,尽管我可以保证addr0=和addr1=将出

我有一个正则表达式,它近似于我想要的:

^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)\/coord0=(.*)\/coord1=(.*)
当我传递此字符串时:

#!addr0=one/addr1=two/coord0=three/coord1=four
它正确地捕获了:1、2、3和4,请参见

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

#!addr0=one/addr1=two
这应该包括:一和二

字符串也可以包含可选内容,尽管我可以保证addr0=和addr1=将出现:

/coord0=three/coord1=four
据我所知,我需要一个可选的非捕获组,因此我认为:

^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)(?:\/coord0=(.*)\/coord1=(.*))?
这不起作用,因为组是:1和2/coord0=3/coord1=4


我想这很接近,因为当我不在末尾打问号时,我得到了:1、2、3和4,但只有addr0=和addr1=的字符串不匹配。

我觉得你在寻找这个:

^#!addr0=(.*?)\/addr1=([^/]*)(?:\/coord0=(.*)\/coord1=(.*))?
在中,请参见右下窗格中的捕获组

原始版本的一个问题是前瞻?=\/addr1=是多余的,因为您总是匹配/address1 对于组2,我们使用否定字符类[^/]*,而不是lazy greedy.*。为什么?因为因为最后一部分是可选的,所以懒惰的。*?会被允许过早放弃。 最后一部分被输入到非捕获组?:并成为可选部分。
也许是检查非斜杠?^!addr0=.*.-/\/addr1=\/addr1=[^/]*?:\/coord0=[^/]*\/coord1=[^/]*?@user887675存在的问题是,我不能在第二个地址上有一个带斜杠的地址……仅供参考,补充说明: