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

How to make an two capturing groups inside a optional non capturing group.

本文关键字:两个 创建 一个      更新时间:2023-09-26

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

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

当我传递这个字符串时:

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

正确捕获:one, two, threefour,见这里。

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

#!addr0=one/addr1=two

这应该捕获:onetwo

字符串还可以包含(虽然我可以保证addr0=addr1=将在那里):

/coord0=three/coord1=four

因此,据我所知,我需要一个可选的非捕获组,所以我认为:

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

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

(点击此处查看)

我猜这是相当接近的,因为当我不把问号放在末尾时,我得到:one, two, threefour,但只有addr0=addr1=的字符串不匹配(这里)。

听起来你在找这个:

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

在演示中,请参见右下角窗格中的捕获组。

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