3

我目前正在使用正则表达式(在 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

4 回答 4

1

您可以在引号中包含除引号之外的所有内容:

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

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

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

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

replace(/\'/g, "’");
于 2012-07-23T16:30:56.420 回答
1

您可以搜索任何不是". 如果你有类似的?东西,我也会做一个懒惰的匹配:"Hey," she said, "what's up?"str

str.replace(/"([^"]*?)"/ig, "“$1”").replace(/\'\b/g, "’");
于 2012-07-23T16:31:22.163 回答
1

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

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

于 2012-07-23T16:54:55.493 回答
1

限制引号左右的特殊字符是个好主意,尤其是在 html 文件中出现这种情况时。我正在使用这个。

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

通过这种方式,您可以避免替换 html-tags 中的引号,例如 href="http.....

正常情况下,开引号的左边有一个空格,结束引号的右边还有一个空格。在 html 文档中,它可能是一个右括号、一个新行等。我还包括了挪威字符。:-)

于 2014-12-08T16:57:43.370 回答