正则表达式修改使捕获的组可以为空或可选

时间:2015-07-12 05:07:31

标签: regex

我们现有正则表达式

ROOT =/(.*)/(-?\d+)/(.*)/(-?\d+)$

ROOT=/ANY_ENTITY/ENTITY1/ENTITY2/ENTITY3$

每个的正则表达式是:

ANY_ENTITY= (.*) , 
ENTITY1 = (-?\d+) ,
ENTITY2 = (.*) ,
ENTITY3 = (-?\d+)

因此,对于输入:{ROOT =/AID/2/3/1},下面是捕获的组:

#1  AID
#2  2
#3  3
#4  1

现在我们需要修改此正则表达式以使ENTITY1可选。  即对于没有ENTITY1 = 2的输入,在前一个示例中为ROOT =/AID/3/1;捕获的组应为:

#1  AID
#2  null
#3  3
#4  1

我尝试使用此修改后的正则表达式使ENTITY1成为可选项(注意/与ENTITY1相关联也是可选的)

ROOT =/(.*)(?:/(-?\d+))?/(.*)/(-?\d+)$

虽然它按预期输入传递:     ROOT =/AID/3/1但未通过  对于有效的ENTITY1值:ROOT =/AID/2/3/1,其中包含以下不正确的捕获组:

#1  AID/2
#2  null
#3  3
#4  1

1 个答案:

答案 0 :(得分:2)

正则表达式应该有一些更改才能正确捕获这些选项

我们可以有像

这样的正则表达式
ROOT =/([^/]*)/(?:(-?\d+)/)?(.*)/(-?\d+)$

Regex Demo

所做的更改

  • ([^/]*)第一个捕获组。在这里,我们将.*更改为否定的字符类,以便它匹配/以外的任何内容。这是导入的,因为.*是贪婪的,有时可能与我们不想要的ENTITY1匹配。

  • (?:(-?\d+)/)?第二个捕获组。查看量词?的位置。我们需要将整个ENTITY1/设为ENTITY,而/只需{{1}}