使用正则表达式将单引号更改为双引号



我正在尝试将所有单引号更改为字符串中的双引号(除非单引号出现在单词中间)。然而,我的代码无法在示例字符串上正常工作:

let r = /(W)'|'(W)|^'|'$/g;
let s = "'ble' 'bla' aren't"
s.replace(r, "$1"$2");

代码返回的是:

""ble" 'bla" aren't"

所以"bla"的开场引号是单引号。我不知道为什么会这样。关于为什么我的解决方案不起作用的任何想法?

由于重叠,您的解决方案不起作用。在e' 'b中,'(W)匹配'(引号+空格),则消耗空间,然后消耗以下引号(就在b之前)无法匹配,因为前面没有非单词。

仅当单引号前后有非单词边界时,才替换单引号:

let r = /B'|'B/g;
let s = "'ble' 'bla' aren't"
s = s.replace(r, """);
console.log(s);

由于正则表达式不是很灵活,您可以尝试多次替换,我可以通过替换 2 次来做到这一点

let r = /([^a-z])'(w)/g;
let s = "'ble' 'bla' aren't"
s = s.replace(r, "$1"$2");
s.replace(/(w)'([^a-z])/g,"$1"$2");

正确使用直双引号和单引号不属于正确的标点符号文本 - 它们实际上在代码中使用。应改用卷曲的双"和单"'引号(又名智能引号)。只需按照OP中示例提供的上下文,需要保留撇号意味着文本是内容而不是代码:

如何:"'ble''bla'不会"不会是:"ble"bla"不是">

没有冲突?

如果行在代码中,则需要对内部的双引号进行转义,或者用反引号替换外部引号。如果它只是大陆,那么它可能在语法上不正确(不确定)?

以下演示将用卷曲/智能对应项替换直双引号和单引号。当直单引号前面没有空格、^|[-,—,/、([{"]时,它会用卷曲/智能右单引号替换直单引号,这是结束引号或撇号的谓词。

您可以删除不需要的语句。

let str = document.querySelector('main').innerHTML;
document.querySelector('output').innerHTML = smarten(str);
function smarten(str) {
// Opening single quote
str = str.replace(/(^|[-—/([{"s])'/g, "$1u2018");
// Closing single quote and apostrophe
str = str.replace(/'/g, "u2019");
// Opening double quote
str = str.replace(/(^|[-—/([{‘s])"/g, "$1u201c");
// Closing double quote
str = str.replace(/"/g, "u201d");
return str;
}
<main>
<p>From Sun Tzu's <i>The Art of War</i>, "If you know both yourself and your enemy, you can win numerous (literally, 'a hundred') battles without jeopardy."</p>
</main>
<output></output>

最新更新