Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中匹配开头和结尾引号(简单引号)_Javascript_Regex - Fatal编程技术网

在JavaScript中匹配开头和结尾引号(简单引号)

在JavaScript中匹配开头和结尾引号(简单引号),javascript,regex,Javascript,Regex,我想将字符串的所有简单引号(“…”)更改为智能引号(“…”): 但后来我意识到,为了做到这一点,我必须匹配开盘价和收盘价,比如: str.replace(/REGEX_FOR_OPENING_QUOTES/g,'“'); str.replace(/REGEX_FOR_CLOSING)_QUOTES/g,'”'); 在这种情况下,我应该使用什么正则表达式?您可以使用基于前瞻的正则表达式: var s = 'abc "quoted string" foo bar "another quoted t

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

但后来我意识到,为了做到这一点,我必须匹配开盘价和收盘价,比如:

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

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

您可以使用基于前瞻的正则表达式:

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
var s='abc'引用字符串“foo bar”另一个引用文本“baz”;
var r=s.replace(/“(?=(([^”]+”{2})*[^”]*“[^”]*$)/g');
//=>abc食品酒吧
PS:
替换为


诀窍是先使用此前瞻查找
”“的奇数:
(?=(([^“]+”){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字符。这些是
&ldquo
(“”)和
(“”)。如果需要确保
形成一对,并且假设两个最近的双引号应该匹配,则另一种解决方案是:

input.replace(/"([^"]*)"/g, "“$1”");
运行示例:

'"test" dskfjsdfklds "sdfsdf" "'.replace(/"([^"]*)"/g, "“$1”");
输出:

“test” dskfjsdfklds “sdfsdf” "

(最后一个
没有转换,因为它没有形成一对)

不确定为什么要这样做,但是->@adeneo:这个答案没有JS特定的解决方案。@anubhava-你是认真的吗,我关闭了这个->是的,答案说:对于不支持向后看的语言,比如Javascript,只要你先替换所有正面的,你就有两个选择:问题是如何首先获得所有正面的?@anubhava-这是一个javascript问题,有一个javascript答案,实际上有8个,其中一个是可以接受的。如果你觉得没有人能回答这个问题,也许你应该把这个问题作为这个问题的副本来结束。不知道为什么所有的东西都变成了开头的智能报价。我做了这个
chapterString=chapterContent.replace(/“(?=(([^“]+”){2})*[^“*”[^“]*$)/g'”).replace(/“/g'”)
)我得到了一个东西:

“什么?”我的约会日期

我会在回到我的电脑几分钟后发布一个JSFIDLE演示链接。哦,是的,我意识到这是因为我有这样的东西“>”什么?代码认为这是一个词。好的,非常感谢。@alexchenco:我不知道你为什么接受这个庞大的正则表达式作为公认的答案,而下面有一个使用替换函数的更简单的解决方案。@nhahtdh好的,我取消了答案。我等一会儿再看。
这些是&ldquo;(“”)和&rdquo;(“”)。
这是个糟糕的建议。HTML实体不会在脚本标记内转换。左引号使用Unicode转义,右引号使用Unicode转义。
“test” dskfjsdfklds “sdfsdf” "