我正在尝试将所有单引号更改为字符串中的双引号(除非单引号出现在单词的中间)。但是我的代码在示例字符串上无法正常工作:
Search record by name.
Enter text to search: Mi
Search found 2 records.
# STN Name Phone
1 0123456 John Smith 111222
2 7676767 Milka Sjanovic 012012
代码返回的是:
let r = /(\W)'|'(\W)|^'|'$/g;
let s = "'ble' 'bla' aren't"
s.replace(r, "$1\"$2");
所以'bla'的引号是单引号。我不知道为什么。关于我的解决方案不起作用的任何想法?
答案 0 :(得分:5)
您的解决方案由于重叠而无法使用。在e' 'b
中,'(\W)
匹配'
(引号+空格),然后先消耗掉空格,然后再加上以下引号(由于没有非单词,因此b
之前不能匹配)之前。
仅在单引号之前或之后是非单词边界时,才替换单引号:
let r = /\B'|'\B/g;
let s = "'ble' 'bla' aren't"
s = s.replace(r, "\"");
console.log(s);
答案 1 :(得分:0)
由于正则表达式不是很灵活,您可以尝试多次替换,我可以通过替换两次来实现
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");
答案 2 :(得分:0)
正确使用直双引号和单引号不属于标点符号的文本,它们实际上是在代码中使用的Curly double “ ” and single ‘ ’ quotes (a.k.a. smart quotes) should be used instead。只是按照OP中示例提供的上下文进行操作,需要保持撇号表示文本是内容而不是代码:
怎么样:“'ble''bla'不是”
会变成:““ ble”“ bla”不是“
没有冲突吗?
如果该行在代码内,则需要转义其中的双引号或将反引号替换为外部引号。如果只是大陆,那么它在语法上可能是不正确的(不确定)?
下面的演示将用双引号和双引号替换其大写/智能引号。当它的 not 前面没有空格^
,|
,[
时,它用直的单引号替换为卷曲的/聪明的右引号' ,-
,—,/,(
,\
,[
,{
,"
或]
结束语或撇号的谓词。
您可以删除不需要的语句。
let str = document.querySelector('main').innerHTML;
document.querySelector('output').innerHTML = smarten(str);
function smarten(str) {
// Opening single quote
str = str.replace(/(^|[-—/(\[{"\s])'/g, "$1\u2018");
// Closing single quote and apostrophe
str = str.replace(/'/g, "\u2019");
// Opening double quote
str = str.replace(/(^|[-—/(\[{‘\s])"/g, "$1\u201c");
// 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>