我正在尝试使用Java Regex分割此类型字符串:
/api/vX/client/domain/category/id
粗略地说:
(?:/api)?(?:/vX)?(/client/domain/...)?(?:/category)?(?:...)?
我会把它分成以下几组:
现在,我正在尝试使用这样的正则表达式,但这并不像我期望的那样工作。
(\/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
答案 0 :(得分:3)
以下正则表达式将与您定义的匹配:
^(/api)?(/v\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$
^
匹配行的开头(/api)?
群组 1 (可选)(/v\d+)?
群组 2 (可选)(/[^/]+(?:/[^/]+)*?)??
群组 3 匹配任意数量的群组,包括客户端,域等。(可选)
[^/]+
是 character class ,可以匹配除斜线之外的任何内容。(?:(/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