正则表达式:如何仅替换非指定固定字符串的目标内容?
正则匹配替换需求解决方案
需求说明
需要匹配并替换形如mystring = "string-text"的字符串,规则如下:
- 仅当
string-text**完全等于red**时,保持原字符串不变 - 其他所有情况(包括空字符串、包含
red但非完全匹配的内容),替换为mystring = "XYZ string-text"
测试案例参考:
original-text replacement ------------- ----------- mystring = "red" mystring = "red" mystring = "green" mystring = "XYZ green" mystring = "blue" mystring = "XYZ blue" mystring = "reds" mystring = "XYZ reds" mystring = "_red" mystring = "XYZ _red" mystring = "1ed" mystring = "XYZ 1ed" mystring = "ree" mystring = "XYZ ree" mystring = "" mystring = "XYZ " mystring = "12345678" mystring = "XYZ 12345678"
现有正则的问题
你当前写出的正则:
^mystring = "(?!red)(.*)"$
处理mystring = "reds"时失效,原因是负向前瞻(?!red)仅检查字符串开头是否不是red,而"reds"的开头正好是red,导致被错误排除,无法触发替换。
修正后的正则方案
给负向前瞻加上结束边界$,限定引号内的内容不能完全等于red,修正后的正则:
^mystring = "(?!red$)(.*)"$
替换规则
替换字符串使用:
mystring = "XYZ \1"
原理说明
(?!red$):负向前瞻断言,确保引号内的内容不是完整的red(因为从引号开头到结尾完全匹配red时才会触发不匹配)- 该正则既保留了
mystring = "red"不被替换,又能匹配所有其他符合要求的情况,完美覆盖测试案例。
内容的提问来源于stack exchange,提问作者Robb Hoff
相关产品推荐
相关产品推荐

