Java Regex将路径解析为多个可选组

时间:2015-11-15 04:27:59

标签: java regex

我正在尝试使用Java Regex分割此类型字符串:

/api/vX/client/domain/category/id

粗略地说:

(?:/api)?(?:/vX)?(/client/domain/...)?(?:/category)?(?:...)?

我会把它分成以下几组:

  • [0] / api
  • [1] / vX(1-x)
  • [2] / client / domain(/ a / b / ...)(以下类别)
  • [3] / category1 | /类别2
  • [4] /其他一切

现在,我正在尝试使用这样的正则表达式,但这并不像我期望的那样工作。

(\/api)?(\/v\d+)?(\/\w+)(\/category1|category2\/?.*)?

我还需要考虑尾随/前导斜杠,期望一个前导斜杠始终会启动一个段,但是尾随斜杠可能会或可能不会出现(除非有下一个段)。

我想要实现的路径和输出的一些示例是:

/client: 
[0], [1], [2]=/client, [3], [4]

/api/client: 
[0]=/api, [1], [2]=/client, [3], [4]

/api/v1/client/domain: 
[0]=/api, [1]=/v1, [2]=/client, [3], [4]

/api/v1/client/domain/category1: 
[0]=/api, [1]=/v1, [2]=/client/domain, [3]=/category1, [4]

api/v1/client/d1/d2/d3/category1: 
[0]=/api, [1]=/v1, [2]=/client/d1/d2/d3, [3]=/category1, [4]

/api/v2/client/domain/category2/id: 
[0]=/api, [1]=/v2, [2]=/client/domain, [3]=/category2, [4]=/id

1 个答案:

答案 0 :(得分:3)

以下正则表达式将与您定义的匹配:

 ^(/api)?(/v\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$
  • ^匹配行的开头
  • (/api)?群组 1 (可选)
  • (/v\d+)?群组 2 (可选)
  • (/[^/]+(?:/[^/]+)*?)??群组 3 匹配任意数量的群组,包括客户端,域等。(可选)
  • (?:(/category[12])(/.*)?)?是可选的 non capturing group ,匹配:
    • (/category[12])类别1或2 4
    • (/.*)?群组 5 :其他任何内容(可选)
  • $字符串的结尾(强制延迟匹配以捕获所有文本非常重要)

<强>代码

String text = "/api/v2/client/domain/category2/id";
String pattern = "^(/api)?(/v\\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$";
Pattern regex = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = regex.matcher(text);

while (m.find())
{
    System.out.println("api: " + m.group(1) + 
                       "\nversion: " + m.group(2) +
                       "\nclient: " + m.group(3) +
                       "\ncategory: " + m.group(4) +
                       "\nextra: " + m.group(5));
}

<强>输出

api: /api
version: /v2
client: /client/domain
category: /category2
extra: /id

ideone demo