用于排除和捕获可选子字符串的正则表达式

时间:2014-10-31 08:28:13

标签: regex

我有这个字符串:

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/

3 个答案:

答案 0 :(得分:4)

  • 使用OR语句在最后设置$.json(?=$|(\.json))
  • 让你的模式捕捉" foo.bar"非贪婪:(.+?)?,不能抓住.json
^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json))

Regular expression visualization

答案 1 :(得分:2)

你的第一个正则表达式是好的,但你忘了一件事:你可以在没有.json的情况下完成:

为此你必须说你可以有.json或行结束$:(?=$|(\.json))

然后你有:^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json))

DEMO(查看匹配信息右侧面板)

希望它有所帮助。

答案 2 :(得分:1)

你不需要积极向前看。 (.*?)(\.json)?会将\.json之前的字符捕获到可选组,并将.json捕获到另一个可选组中。

^(rest)\/([^\/\.]+)(.*?)(\.json)?$

DEMO