我有一个应用程序,它使用基于Javascript的规则引擎。我需要一种方法将常规的直引号转换为卷曲(或智能)引号。可以使用 string.replace
替换 ["]
来实现,但这只会插入一个卷曲引号。
我能想到的最好方法是将第一个引号替换为左卷曲引号,之后每个引号都替换为左卷曲引号,而剩余的引号替换为右卷曲引号。
是否有一种用Javascript实现这个目标的方法?
我有一个应用程序,它使用基于Javascript的规则引擎。我需要一种方法将常规的直引号转换为卷曲(或智能)引号。可以使用 string.replace
替换 ["]
来实现,但这只会插入一个卷曲引号。
我能想到的最好方法是将第一个引号替换为左卷曲引号,之后每个引号都替换为左卷曲引号,而剩余的引号替换为右卷曲引号。
是否有一种用Javascript实现这个目标的方法?
你可以用左引号替换所有紧跟着一个单词字符之前的内容,用右引号替换所有跟在一个单词字符之后的内容。
str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "”"); // IF the language supports look-
// behind. Otherwise, see below.
正如下面的评论所指出的那样,这并没有考虑标点符号,但很容易实现:
/(?<=[\w,.?!\)]|^)"/g
[编辑:] 对于不支持反向查找的语言(例如Javascript),只要首先替换所有正向查找,您有两个选择:
str = str.replace(/"/g, "”"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "”"); // Replace any quotes after a word
// boundary with right curly quotes
(如果有人使用支持向后查找的语言,我已经在上面保留了原始解决方案,以便他们参考)
?=
是一个前瞻,它之所以匹配是因为它向前查看并看到引号,而引号在你的字符类中。我建议采用我编辑后答案中的第一个“替代”解决方案 - 在替换左花括号后,将所有花括号都替换为右花括号。 - Nicole\w
,而是使用一个正则表达式来处理前导引号和另一个正则表达式来处理尾随引号的策略。它将正确编码大多数情况([编辑]后的第一个建议将解决您提出的问题),一个错误的情况不会破坏其他情况,并且可以轻松编辑以涵盖更多情况。例如,您可以反转它以基于另一侧的空格触发。或者,您可以将标点符号添加到字符类中。 - Nicole您可能想看看Pandoc的功能-显然使用--smart
选项,它可以在所有情况下(包括例如“'tis”和“'twere”)正确处理引号。
我最近编写了一个JavaScript排版美化引擎,其中包括引号替换。我最终使用了Renesis建议的算法,但目前还有一个失败的测试正在等待更智能的解决方案。
如果您有兴趣借鉴我的代码(和/或提交基于您所做工作的补丁),请查看:jsPrettify。jsprettify.prettifyStr
可以实现您要求的功能。如果您不想处理Closure依赖关系,则有一个旧版本可以独立运行-它甚至可以在Rhino中运行。
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
return "“" + m1 + "”";
});
str.replace(/\"([^\"]*)\"/gi,"“$1”");
只要您要排版的文本没有因为双引号的不当使用而出现错误,这个功能就能完美工作。在英语中,引号从不嵌套。
我在这里没有找到我想要的逻辑,所以这就是我最终选择的方案。
value = value.replace(/(^|\s)(")/g, "$1“"); // replace quotes that start a line or follow spaces
value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote
我有一个小文本框,需要将直引号替换为卷引号(智能引号)。 我只是在键盘按键事件时执行此逻辑。 我试图使它的行为类似于Microsoft Word。
我认为像这样的一般情况并不容易,因为您必须准确解释内容中每个双引号字符的含义。话虽如此,我会收集所有我感兴趣的文本节点,然后逐个跟踪每个双引号实例的“开/关”(或“奇/偶”;任何)性质。然后您就可以知道要使用哪个替换实体。
为了记录下来,我发了这篇文章。
根据@Steven Dee的建议,我去了Pandoc。
每当可能时,我都会尽量使用成熟和经过测试的工具,而不是自己编写正则表达式。手动编写的正则表达式可能会过于贪婪或者不够贪婪,也可能对单词边界和逗号等不敏感。Pandoc 能够解决大部分问题。
从命令行(--smart参数打开智能引号):
pandoc --smart --standalone -o output.html input.html
我知道命令行脚本可能不符合OP使用JavaScript的要求。(相关:如何在JavaScript中执行shell命令)