首页 > 小白问个简单正则:双引号替换

小白问个简单正则:双引号替换

比如字符串为:

\"小陈\" 是一个 "好人"

我需要把所有非 \" 的引号替换成 \"

需要的效果:

\"小陈\" 是一个 \"好人\"


我的思路:

我这样可以找出所有前面不带\的双引号:

[^\]"

但是这样找出来两条的结果是:

个"
人"

怎样达到只替换这两个双引号?(而不把前面那个字符也替换了)


http://deerchao.net/tutorials/regex/regex.htm#negativelookaround

我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

不过JS的正则不支持这个特性,可以用普通的捕获组

'\\"小陈\\" 是一个 "好人"'.replace(/([^\\])"/g, '$1\\"')
"\"小陈\" 是一个 \"好人\""

普通替换2次:
\" -> "
" -> \"


正则

^"|(?<=[^\\])"

如果你用的正则表达式支持negative look-behind的话,把这个(?<!\\)\"替换为这个\\\"就可以了


使用正则中的逆序否定环视操作,在php中实现是这样的:

$pattern = "/(?<!\\\\)(\")/i";
$str = '\"小陈\" 是一个 "好人"';
$res = preg_replace($pattern, '\\\\"', $str);
echo $res;

输出结果是;

\"小陈\" 是一个 \"好人\"
【热门文章】
【热门文章】