如何构造无重复前置断言的正则:匹配至最后指定字符或字符串末尾
正则表达式优化方案
需求:构造正则表达式,从i_开始匹配,到最后一个_的位置截止;如果字符串里没有_,就匹配到末尾。
测试输入
i_123_Mobile i_123_abc_Mobile i_123aa_abcdaeedg_Desktop i_abc123
预期输出
123 123_abc 123aa_abcdaeedg abc123
你之前用(?<=i_).*(?=_)|(?<=i_).*$虽然能实现需求,但重复写了(?<=i_),这里给你两种优化写法:
写法一:利用捕获组简化逻辑
直接用捕获组提取目标内容,正则如下:
i_(.*)(?:_[^_]*)?$
逻辑说明:
i_:匹配开头的固定前缀(.*):捕获我们需要的目标内容,贪婪匹配会自动停在最后一个_的前面,因为后面的非捕获组会匹配最后一个_及其后续所有内容(?:_[^_]*)?:非捕获组,匹配可选的“最后一个_+后续内容”,?表示这个部分可以不存在$:匹配字符串结尾
使用时直接提取第一个捕获组的内容即可,无需重复写前置断言。
写法二:合并正向断言
如果偏好使用断言而不依赖捕获组,可以用合并后的断言写法:
(?<=i_).*(?=(?:_[^_]*)?$)
逻辑说明:
(?<=i_):前置断言,确保匹配内容在i_之后.*:贪婪匹配目标内容(?=(?:_[^_]*)?$):后置断言,要求匹配内容的后面要么是“最后一个_+后续内容+结尾”,要么直接是结尾,自动适配有无_的两种情况
这两种写法都能避免重复使用前置断言,同时满足所有测试用例的需求。
内容的提问来源于stack exchange,提问作者OfirD
相关产品推荐
相关产品推荐

