我们现有正则表达式
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
答案 0 :(得分:2)
正则表达式应该有一些更改才能正确捕获这些选项
我们可以有像
这样的正则表达式ROOT =/([^/]*)/(?:(-?\d+)/)?(.*)/(-?\d+)$
所做的更改
([^/]*)
第一个捕获组。在这里,我们将.*
更改为否定的字符类,以便它匹配/
以外的任何内容。这是导入的,因为.*
是贪婪的,有时可能与我们不想要的ENTITY1
匹配。
(?:(-?\d+)/)?
第二个捕获组。查看量词?
的位置。我们需要将整个ENTITY1/
设为ENTITY
,而/
只需{{1}}