正则表达式:如何匹配字符串中间可选POST组并提取路径
解决方案
可以使用以下正则表达式来满足需求:
foo\.add\(\"([^"]+)\"(?:.*?(HttpMethod\.POST))?.*\)
正则说明
foo\.add\(:精准匹配方法调用的开头部分\"([^"]+)\":捕获引号内的路径内容,[^"]+确保只匹配当前引号内的字符,不会意外跨引号匹配(?:.*?(HttpMethod\.POST))?:可选的非捕获组,用.*?(懒惰模式)匹配任意字符,直到找到HttpMethod.POST并将其存入第二个分组;尾部的?表示该分组可省略(即没有POST的情况).*\):匹配方法调用剩余的所有内容直到行尾的闭合括号
测试验证
针对你给出的三种行格式:
- 第一行
foo.add("/some/path", class::someFunction):- 分组1:
/some/path - 分组2:空(无POST)
- 分组1:
- 第二行
foo.add("/another/path", class::someOtherFunction, HttpMethod.POST, class::yetAnotherFunction):- 分组1:
/another/path - 分组2:
HttpMethod.POST
- 分组1:
- 第三行
foo.add("/other/path", class::firstFunction, class::secondFunction, class::thirdFunction, HttpMethod.POST, class::yetAnotherFunction):- 分组1:
/other/path - 分组2:
HttpMethod.POST
- 分组1:
为什么之前的正则失效
- 你最初的
[^,]+会在第一个逗号处停止匹配,无法覆盖长行中后续的参数内容 - 贪婪模式的
.+会直接匹配到行尾,导致POST被包含在末尾的任意字符中,无法单独捕获 - 单纯的懒惰模式
.+?可能在遇到第一个无关的参数时就停止匹配,错过后面位置的POST
内容的提问来源于stack exchange,提问作者Horgh
相关产品推荐
相关产品推荐

