如何使用正则表达式解析路径 - 可选字段

时间:2017-03-08 20:07:22

标签: regex

我使用以下正则表达式:(示例:https://regex101.com/r/dVTUrM/1

\/(?<field1>.{4})\/(?<field2>.*?)\/(?<field3>.*?)\/(?<field4>.*?)\/(?<field5>.*?)\/(?<field6>.*)

解析以下文字:

pyramid:/A49E/18DA-6FAB-4921-8AEB-45A07B162DA5/{E3646FA1-4652-45E9-885A-3756FC574057}/{F1864679-1D9D-4084-B38D-231D793AA15D}/9/abc.tif

给出以下结果:

Group `field1`  9-13    `A49E`
Group `field2`  14-46   `18DA-6FAB-4921-8AEB-45A07B162DA5`
Group `field3`  47-85   `{E3646FA1-4652-45E9-885A-3756FC574057}`
Group `field4`  86-124  `{F1864679-1D9D-4084-B38D-231D793AA15D}`
Group `field5`  125-126 `9`
Group `field6`  127-134 `abc.tif`

但是如果缺少field5和field 6:

pyramid:/A49E/18DA-6FAB-4921-8AEB-45A07B162DA5/{E3646FA1-4652-45E9-885A-3756FC574057}/{F1864679-1D9D-4084-B38D-231D793AA15D}

我希望这可以工作,而field5和field6是空白的。

这可以通过修改正则表达式声明来实现吗?

注意:也可能只缺少field6。

1 个答案:

答案 0 :(得分:1)

你走了:

(?x)^pyramid:
/(?P<field1>[^/]{4})
/(?P<field2>[^/]+)
/(?P<field3>[^/]+)
/(?P<field4>[^/]+)
(?:
    /(?P<field5>[^/]+)
    /(?P<field6>[^/]+)
)?

a demo on regex101.com

或者,简而言之(没有详细标志):

^pyramid:/(?P<field1>[^/]{4})/(?P<field2>[^/]+)/(?P<field3>[^/]+)/(?P<field4>[^/]+)(?:/(?P<field5>[^/]+)/(?P<field6>[^/]+))?

根据所使用的编程语言/风格,您可以使用其他分隔符,例如~,这样您就不再需要转义正斜杠了。 (?: ... )构造是非捕获组,使?可选,允许4或6个(但不是5个!)字段。