所以我的这个正则表达式是我想要的近似值:
^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)\/coord0=(.*)\/coord1=(.*)
当我传递这个字符串时:
#!addr0=one/addr1=two/coord0=three/coord1=four
它正确捕获:one
,two
,three
和four
,请参阅here。
问题是我希望能够捕获以下字符串:
#!addr0=one/addr1=two
这应该捕获:one
和two
。
并且字符串也可以包含(尽管我可以保证addr0=
和addr1=
会在那里):
/coord0=three/coord1=four
据我所知,我需要一个可选的非捕获组,所以我想这个:
^#!addr0=(.*?)(?=\/addr1=)\/addr1=(.*)(?:\/coord0=(.*)\/coord1=(.*))?
这不起作用,因为这些群组是:one
和two/coord0=three/coord1=four
。
我觉得这很接近,因为当我没有把问号放在最后时,我得到:one
,two
,three
和four
但是仅addr0=
和addr1=
的字符串不匹配(here)。
答案 0 :(得分:0)
听起来像你正在寻找这个:
^#!addr0=(.*?)\/addr1=([^/]*)(?:\/coord0=(.*)\/coord1=(.*))?
在demo中,请参阅右下方窗格中的捕获组。
(?=\/addr1=)
是多余的,因为您总是匹配/address1
.*?
而不是懒惰的贪婪[^/]*
。为什么?因为最后一部分是可选的,所以允许懒惰的.*?
过早放弃。(?:
并可选。