撇号/单引号的正则表达式,带双精度

时间:2012-07-23 16:25:07

标签: javascript regex string replace double-quotes

我目前正在使用正则表达式(在Javascript中)用智能引号替换双引号:

// ie: "quotation" to “quotation”

这是我用来替换双引号的表达式:

str = str.replace(/"([A-Za-z ]*)"/ig, "“$1”")

如果引号内的短语不包含额外的标点符号,则上述工作非常有效,但是,我还需要替换任何撇号:

// ie: replace "It's raining again" with “It’s raining again!”

如果没有封装,替换单引号/撇号的表达式可以正常工作:

str.replace(/\'\b/g, "’"); // returns it's as it’s correctly

// Using both:
str.replace(/"([A-Za-z ]*)"/ig, "“$1”").replace(/\'\b/g, "’");

// "It's raining again!" returns as "It’s raining again!"
// Ignores double quotes

我知道这是因为替换双引号的表达式只与字母匹配,但我对正则表达式的有限经验使我对如何为引用创建匹配感到沮丧,这些引用也可能包含单引号!

任何帮助都会非常感激!提前谢谢。

4 个答案:

答案 0 :(得分:1)

除引号外,您可以在引号中加入:

str = str.replace(/"([^"]*)"/ig, "“$1”")

另一种选择:使用非贪婪的搜索:

str = str.replace(/"(.*?)"/ig, "“$1”")

此外,我不确定您是否只需要更改单词末尾的单引号。改变所有这些可能会更好吗?

replace(/\'/g, "’");

答案 1 :(得分:1)

您可以搜索不是"的任何内容。我还会与?进行懒惰匹配,以防"Hey," she said, "what's up?"str类似:

str.replace(/"([^"]*?)"/ig, "“$1”").replace(/\'\b/g, "’");

答案 2 :(得分:1)

只是为了添加到当前答案,您在[A-Za-z ]*上为双引号替换执行匹配,这意味着“匹配大写,小写或空格”。这与It's raining不匹配,因为您的匹配表达式不包含单引号。

遵循匹配“除了另一个双引号之外的任何内容”的建议,因为对于原始正则表达式,She said "It's raining outside." He said "really?"之类的字符串将导致She said ”It's raining outside." He said "really?”(贪婪的匹配将跳过“内部”双引号。)

答案 3 :(得分:1)

限制引号左右两侧的特定字符是个好主意,尤其是在html文件中。我正在使用这个。

str = str.replace(/([\n >*_-])"([A-Za-z0-9 ÆØÅæøå.,:;!#@]*)"([ -.,!<\n])/ig, "$1«$2»$3");

通过这种方式,您可以避免替换html标签内的引​​号,例如href =&#34; http .....

Normaly,开场报价还剩下一个空格,收盘报价的另一个权利。在html文档中,它可能是一个结束括号,一个新行等。我还包括了挪威字符。 : - )