我有这个字符串:
A. rest/asks/foo.bar.json
B. rest/asks/foo.bar
我需要一个能够捕获以下子串的正则表达式:
1. 'rest'
2. 'asks'
3. '/foo.bar'(optional)
4. '.json' (optional)
我花了几个小时搜索溶剂,但遗憾的是没找到解决方案
试过这个:
^(rest)\/([^\/\.]+)(.+)?(?=(\.json))
但在这种情况下需要\.json
结果:
一个。 rest/asks/foo.bar.json
1. [0-4] `rest`
2. [5-9] `asks`
3. [9-17] `/foo.bar`
4. [17-22] `.json`
B中。 rest/asks/foo.bar
Your pattern does not match the subject string.
试过这个:
^(rest)\/([^\/\.]+)(.+)?(?=(\.json)?)
结果:
一个。 rest/asks/foo.bar.json
1. [0-4] `rest`
2. [5-9] `asks`
3. [9-17] `/foo.bar.json`
B中。 rest/asks/foo.bar
1. [0-4] `rest`
2. [5-9] `asks`
3. [9-17] `/foo.bar`
任何人都可以帮助我吗?
如何像我需要的那样对matche子串进行表达?
您可以在此处测试正则表达式:http://regex101.com/
答案 0 :(得分:4)
$
或.json
:(?=$|(\.json))
(.+?)?
,不能抓住.json
^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json))
答案 1 :(得分:2)
你的第一个正则表达式是好的,但你忘了一件事:你可以在没有.json的情况下完成:
为此你必须说你可以有.json或行结束$:(?=$|(\.json))
然后你有:^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json))
DEMO(查看匹配信息右侧面板)
希望它有所帮助。
答案 2 :(得分:1)
你不需要积极向前看。 (.*?)(\.json)?
会将\.json
之前的字符捕获到可选组,并将.json
捕获到另一个可选组中。
^(rest)\/([^\/\.]+)(.*?)(\.json)?$