【问题标题】:Changing single quotes to double quotes with regular expressions使用正则表达式将单引号更改为双引号
【发布时间】:2019-06-02 12:48:36
【问题描述】:

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

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

代码返回的是:

""ble" 'bla" aren't"

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    由于重叠,您的解决方案不起作用。在e' 'b'(\W)匹配'(quote + space),空间被消耗然后后面的引号(就在b之前不能匹配,因为它之前没有非单词。

    仅当单引号前面或后面有非字边界时才替换:

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

    【讨论】:

      【解决方案2】:

      由于正则表达式不是很灵活,你可以尝试多次替换,我可以通过替换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");
      

      【讨论】:

      • 我认为你有最好的答案,我从不知道正则表达式中有 \B,我已经为你投票了:)
      • 谢谢,但您的正则表达式产生的结果与 OP 相同。
      【解决方案3】:

      正确使用直双 " 和单 ' 引号不属于正确的标点文本 - 它们实际上在代码中使用。Curly double “ ” and single ‘ ’ quotes (a.k.a. smart quotes) should be used instead。只需按照 OP 中示例提供的上下文进行,就需要保留撇号意味着文本是内容而不是代码:

      如何:“'ble' 'bla' are not”
      将是:""ble" "bla" are not"
      没有冲突?

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

      以下演示将用它们的卷曲/智能对应物替换直双引号和单引号。它将直单引号替换为卷曲/智能右单引号 '当它的 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>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 2013-10-20
        相关资源
        最近更新 更多