使用RegEx正则提取存在冒号时对应位置目标字符串的实现方法
正则实现方案
直接上兼容绝大多数正则引擎(JS/Java/Python标准re/Go等)的写法,覆盖提到的全部三种场景,不需要额外写分支判断逻辑。
可用正则表达式
如果待处理内容带示例里的<li>、<strong>类HTML标签:
<li>(?:[^:]*:\s*<strong>([^<]+)<\/strong>|<strong>([^<]+)<\/strong>\s*:.*|<strong>([^<]+)<\/strong>)\s*<\/li>
如果是无HTML标签的纯文本场景,用简化版即可:
^(?:[^:]*:\s*(.+)|(.+?)\s*:.*|(.+))$
提取规则:三个捕获组中取非空的那个值,就是需要的目标字符串。
匹配逻辑说明
正则内三个分支按优先级匹配,分别对应三种场景:
- 第一个分支匹配冒号在目标内容前的情况:比如
SX: 22AA 001 267,直接捕获冒号后的目标内容 - 第二个分支匹配冒号在目标内容后的情况:比如
2294 0BB 267: 09,直接捕获冒号前的目标内容 - 第三个分支匹配整段无冒号的情况:比如
2294 0CC 267,直接捕获整段目标内容
测试验证结果
用给出的三个样例测试,返回结果如下:
- 样例1
SX: <strong>22AA 001 267</strong>:捕获组1返回22AA 001 267 - 样例2
<strong>2294 0BB 267</strong>: 09:捕获组2返回2294 0BB 267 - 样例3
<strong>2294 0CC 267</strong>:捕获组3返回2294 0CC 267
示例中标注的预期输出
2294 001 267应为笔误,如果需要把提取内容里的AA/BB/CC类字符替换为指定值,在正则提取后加一步简单字符串替换即可,不建议把这类逻辑写在正则里,维护成本太高。
内容的提问来源于stack exchange,提问作者ldreamsl
相关产品推荐
相关产品推荐

