正则表达式优化:如何根据字符串位置特征调整匹配长度
正则表达式适配不同前缀长度的截断问题
问题场景
- 处理字符串
q.0.0.0.1-1111, q.0.0.0.1.tt_0-1111, tes-00000000-1111时,用正则r'(?<=[^-\s]{7})[^-]+(?=-)|(?<=-)[^-\s]+-'能得到预期结果:q.0.0.0-1111, q.0.0.0-1111, tes-1111 - 但处理
q.0.00.0.0-1111, q.0.00.0.0.tt_0-1111这类字符串时,得到错误结果q.0.00.-1111, q.0.00.-1111,预期应为q.0.00-1111 - 问题根源在正则的
{7}匹配长度,需要根据字符串第4个字符后的数字长度(一位/两位)动态调整匹配长度(7/6)
解决方案
使用分支正则分别匹配两种前缀结构,无需提前判断字符数量,直接自适应处理:
替换正则表达式:
(?<=q\.\d\.\d\.\d)[^-]+(?=-)|(?<=q\.\d\.\d{2})[^-]+(?=-)|(?<=-)[^-\s]+-
正则逻辑说明
- 第一个分支
(?<=q\.\d\.\d\.\d)[^-]+(?=-):匹配以q.数字.数字.数字(7字符长度)开头的前缀,删除该前缀后到-前的所有内容,对应第一个场景的截断需求 - 第二个分支
(?<=q\.\d\.\d{2})[^-]+(?=-):匹配以q.数字.两位数字(6字符长度)开头的前缀,删除该前缀后到-前的所有内容,解决第二个场景的错误截断问题 - 第三个分支
(?<=-)[^-\s]+-:处理tes-00000000-1111这类结构,删除-后的连续非空非短横线字符及末尾的-,得到tes-1111
验证结果
q.0.0.0.1-1111→q.0.0.0-1111q.0.00.0.0-1111→q.0.00-1111q.0.0.0.1.tt_0-1111→q.0.0.0-1111q.0.00.0.0.tt_0-1111→q.0.00-1111tes-00000000-1111→tes-1111
内容的提问来源于stack exchange,提问作者MrOldSir
相关产品推荐
相关产品推荐

