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

Regex 用于排除和捕获可选子字符串的正则表达式,regex,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)) ^(rest)\/([^\/\.]+)(.+)?(?=(

我有这个字符串:

A. rest/asks/foo.bar.json
B. rest/asks/foo.bar
我需要一个正则表达式,它允许我捕获以下子字符串:

1. 'rest'
2. 'asks'
3. '/foo.bar'(optional)
4. '.json' (optional)
我花了几个小时寻找解决方案,但不幸的是没有找到解决方案

我试过这个:

^(rest)\/([^\/\.]+)(.+)?(?=(\.json))
^(rest)\/([^\/\.]+)(.+)?(?=(\.json)?)
但是在这种情况下需要
\.json

结果:

A.
rest/asks/foo.bar.json

1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar`
4.  [17-22] `.json`
1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar.json`
B.
rest/ask/foo.bar

Your pattern does not match the subject string.
1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar`
我试过这个:

^(rest)\/([^\/\.]+)(.+)?(?=(\.json))
^(rest)\/([^\/\.]+)(.+)?(?=(\.json)?)
结果:

A.
rest/asks/foo.bar.json

1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar`
4.  [17-22] `.json`
1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar.json`
B.
rest/ask/foo.bar

Your pattern does not match the subject string.
1.  [0-4]   `rest`
2.  [5-9]   `asks`
3.  [9-17]  `/foo.bar`
有人能帮我吗

如何使表达式匹配所需的子字符串

您可以在此处测试正则表达式:

  • 使用OR语句将
    $
    .json
    放在末尾:
    (?=$)(\.json))
  • 使捕获“foo.bar”的模式不贪婪:
    (.+?)?
    ,以不捕获
    .json

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

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

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

为此,您必须说明您可以使用.json或行尾$:
(?=$|(\.json))

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

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


希望能有帮助。

这对男人来说很有效!谢谢!您在哪里生成的图表?很好,但是您需要将
(?:(.+?)(\.json)
更改为(?(.+?)(\.json)?`以使其成为可选的。如果没有,它将无法在
rest/ask中正常工作。