我想将字符串的所有简单引号(“...”)更改为智能引号(“...”):
str.replace(/"/g,'“');
然后我意识到,为了做到这一点,我必须匹配开头和结束语,如下所示:
str.replace(/REGEX_FOR_OPENING_QUOTES/g,'“');
str.replace(/REGEX_FOR_CLOSING)_QUOTES/g,'”');
在这种情况下我应该使用什么正则表达式?
答案 0 :(得分:2)
这是一种非常天真的方法,它可以循环显示每个常规报价,并在智能开启和关闭报价之间切换,但它可能适合您...
function addSmartQuotes(str) {
var open = false;
return str.replace(/"/g, function(match, $1) {
open = !open;
return open ? '“' : '”';
});
}
var str = 'This is my "string", blahdy "blah" blah';
console.log(addSmartQuotes(str)); // => This is my “string”, blahdy “blah” blah
还值得注意的是,除非您确定您的网页是UTF-8,否则最好使用HTML字符代码来打开和关闭引号而不是UTF- 8个字符。这些是“
(“)和”
(”)。
答案 1 :(得分:2)
另一种解决方案,如果您需要确保"
形成一对,并且您认为应该匹配两个最接近的双引号:
input.replace(/"([^"]*)"/g, "“$1”");
示例运行:
'"test" dskfjsdfklds "sdfsdf" "'.replace(/"([^"]*)"/g, "“$1”");
输出:
“test” dskfjsdfklds “sdfsdf” "
(最后"
未转换,因为它不会形成一对)
答案 2 :(得分:1)
您可以使用基于前瞻性的正则表达式:
var s = 'abc "quoted string" foo bar "another quoted text" baz';
var r = s.replace(/"(?=(([^"]+"){2})*[^"]*"[^"]*$)/g, '<').replace(/"/g, '>');
//=> abc <quoted string> foo bar <another quoted text> baz
PS:按<
和>
替换“
和”
。
诀窍是首先使用此前瞻查找"
后跟奇数"
:(?=(([^"]+"){2})*[^"]*"[^"]*$)
。然后,剩余的结束"
可以替换为”
。