如何仅替换字符串中间的双引号(不修改首尾双引号)
解决仅替换字符串中间转义双引号的问题
原正则的问题在于,它没有排除字符串开头的"——开头的"满足(?<=^|[^"])(^匹配开头位置),同时(?=\S.*")也成立(后面有内容和结尾的"),因此被错误替换。
要实现仅替换中间的",需明确排除字符串开头的第一个"和字符串结尾的最后一个",以下是可行的解决方案:
正则表达式与示例代码
let str = '"This is a "test" string with "quotes" in the middle."'; // 匹配既不在开头、也不在结尾的 " let result = str.replace(/(?<!^)"(?!$)/g, 'replacement'); console.log(result);
运行结果
"This is a replacementtestreplacement string with replacementquotesreplacement in the middle."
正则说明
(?<!^):负向零宽断言,确保当前位置不是字符串开头,直接排除第一个"":匹配目标转义双引号(?!$):负向零宽断言,确保当前位置不是字符串结尾,直接排除最后一个"/g:全局匹配标记,替换所有符合条件的"
如果需要更严谨地匹配被内容包裹的中间引号(避免替换孤立的中间引号,若有此需求),可调整为匹配前后都有非引号内容的":
let result = str.replace(/(?<=[^"])"(?=[^"])/g, 'replacement');
该正则会匹配前后都存在非"字符的转义双引号,同样不会触及开头和结尾的引号。
内容的提问来源于stack exchange,提问作者Bardelman
相关产品推荐
相关产品推荐

