在JavaScript中匹配开始和结束报价(简单引号)

时间:2015-01-05 05:38:02

标签: javascript regex

我想将字符串的所有简单引号(“...”)更改为智能引号(“...”):

str.replace(/"/g,'“');

然后我意识到,为了做到这一点,我必须匹配开头和结束语,如下所示:

str.replace(/REGEX_FOR_OPENING_QUOTES/g,'“');
str.replace(/REGEX_FOR_CLOSING)_QUOTES/g,'”');

在这种情况下我应该使用什么正则表达式?

3 个答案:

答案 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})*[^"]*"[^"]*$)。然后,剩余的结束"可以替换为