如何用条件正则表达式按规则提取URI至命名捕获组
条件正则表达式提取URI至命名捕获组
问题描述
你需要从字符串中提取URI到名为<value>的命名捕获组,规则如下:
- 如果URI包含
execute,仅匹配到execute为止 - 如果不包含
execute,匹配完整URI
当前使用的(?P<value>\S+)会匹配完整URI(即使包含execute),希望实现符合规则的匹配,示例如下:
| 原始URI | 期望 |
|---|---|
| /cu/rest/en_US/reports/execute/310F02501000016D001218A1AZ6B2D16 | /cu/rest/en_US/reports/execute |
| /cu/rest/en_US/reports/execute/newResource/ | /cu/rest/en_US/reports/execute |
| /cu/rest/en_US/link/xml | /cu/rest/en_US/link/xml |
解决方案
当然可以实现!你需要的是带条件分支的正则表达式,通过正向/负向预查区分两种匹配场景,具体实现如下:
(?P<value>(?=.*execute).*?/execute|(?!.*execute)\S+)
正则表达式拆解
(?=.*execute):正向预查,确认字符串中存在execute,触发第一分支逻辑.*?/execute:非贪婪匹配任意字符,直到遇到并包含最后一个/execute,确保停在execute结束的位置|:分支运算符,分隔两种匹配规则(?!.*execute):负向预查,确认字符串中不存在execute,触发第二分支逻辑\S+:匹配所有非空白字符,即完整的URI
匹配验证
将上述正则应用到你的示例中,会完全符合预期:
- 对于
/cu/rest/en_US/reports/execute/310F02501000016D001218A1AZ6B2D16,捕获到/cu/rest/en_US/reports/execute - 对于
/cu/rest/en_US/reports/execute/newResource/,捕获到/cu/rest/en_US/reports/execute - 对于
/cu/rest/en_US/link/xml,捕获到完整的/cu/rest/en_US/link/xml
如果你的URI有固定前缀(比如都以/cu/rest/开头),可以进一步优化正则来提升精准度:
(?P<value>/cu/rest/[^/\s]+/(?:reports/execute|(?:(?!execute).)+))
这个版本限定了前缀范围,避免匹配到无关的非空白字符串,适合场景固定的情况。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

