gpt4 book ai didi

将路径解析为多个可选组的 Java 正则表达式

转载 作者:行者123 更新时间:2023-11-29 04:56:05 26 4
gpt4 key购买 nike

我正在尝试使用 Java 正则表达式拆分此类型的字符串:

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

粗略地说:

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

我会将其分为以下几组:

  • [0]/接口(interface)
  • [1]/vX (1-x)
  • [2]/client/domain (/a/b/...)(直到下面的类别)
  • [3]/类别 1 |/类别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

最佳答案

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

 ^(/api)?(/v\d+)?(/[^/]+(?:/[^/]+)*?)??(?:(/category[12])(/.*)?)?$
  • ^ 匹配行首
  • (/api)?1(可选)
  • (/v\d+)?2(可选)
  • (/[^/]+(?:/[^/]+)*?)??3 匹配任意数量的组,对于客户端,域等(可选)
    • 外部和内部组都有一个 lazy quantifier ,以允许在类别中进行匹配。
    • [^/]+ 是一个 character class 匹配除斜线以外的任何内容。
  • (?:(/category[12])(/.*)?)? 是可选的 non capturing group 匹配:
    • (/category[12]) 4
    • 类别 1 或 2
    • (/.*)? 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

关于将路径解析为多个可选组的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com