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

时间:2019-06-02 12:48:36

标签: javascript regex

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

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'的引号是单引号。我不知道为什么。关于我的解决方案不起作用的任何想法?

3 个答案:

答案 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>