比如字符串为:
\"小陈\" 是一个 "好人"
我需要把所有非 \"
的引号替换成 \"
需要的效果:
\"小陈\" 是一个 \"好人\"
我的思路:
我这样可以找出所有前面不带\
的双引号:
[^\]"
但是这样找出来两条的结果是:
个"
人"
怎样达到只替换这两个双引号?(而不把前面那个字符也替换了)
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;
输出结果是;
\"小陈\" 是一个 \"好人\"