【问题标题】:How to target a dash or hyphen in RegEx if used in a javascript .replace?如果在 javascript .replace 中使用,如何在 RegEx 中定位破折号或连字符?
【发布时间】:2021-01-18 05:53:09
【问题描述】:

我正在尝试使用 RegEx 定位破折号或连字符。不过,这对于我如何使用它似乎是不可能的。我在网上找到的其他答案似乎与我的情况不符。

场景:

如果我点击一个按钮,这个脚本会替换指定的数字+字母。它工作正常,直到现在我要在列表中包含一个连字符。

请查看下面使用的正则表达式,代码如下:

const mapper = new Map();
mapper.set("10th", "11th");
mapper.set("-", "Deleted");
mapper.set("63", "Deleted");
mapper.set("63-5", "Deleted");
mapper.set("121AA", "95");

function fixtext() {
  const elm = document.getElementById("textarea1");
  if (elm) {
    elm.value = elm.value
      .replace(
        /\b\d+(?:A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|AA|BB|CC|DD|EE|FF|GG|HH|II|JJ|KK|LL|MM|NN|OO|PP|QQ|RR|SS|TT|UU|VV|WW|XX|YY|ZZ|d|th|st|nd)?\b/g,
        m => mapper.has(m) ? mapper.get(m) : m
      );
  }
}
<textarea id="textarea1" rows="4" cols="50">(10th ed), Pretrial Proceedings sample 121AA and - and 63 63-5</textarea>

<button class="nbtngreen" onclick="fixtext()">Update</button>

对于63-5,应该整体改,而不是Deleted-5

我尝试使用我在网上看到的几个 RegEx 来转义或匹配它。以下是其中一些: []-] [a-zA-Z0-9!$* \t\r\n\-] [-] [abc-]

这些都不适合我,或者我不明白这次如何让它发挥作用。

我也很想缩短我的 RegEx,但这也是问题所在。 [A-z] 或类似的东西也不起作用。

非常感谢有关如何解决此问题的任何帮助。提前致谢!

【问题讨论】:

    标签: javascript html regex


    【解决方案1】:

    您可以改用更简单的方法。您只需替换地图中的键。因此,按照长度的降序对键进行排序,然后将每个键替换为其值。

    按长度降序排序是为了确保首先替换较长的键。

    const mapper = new Map();
    mapper.set("10th", "11th");
    mapper.set("-", "Deleted");
    mapper.set("63", "Deleted");
    mapper.set("63-5", "Deleted");
    mapper.set("121AA", "95");
    const keys = [...mapper.keys()].sort((a, b) => b.length - a.length);
    
    function fixtext() {
      const elm = document.getElementById("textarea1");
      if (elm) {
        for (const key of keys) {
          elm.value = elm.value.replace(new RegExp(key, 'g'), mapper.get(key));
        }
      }
    }
    <textarea id="textarea1" rows="4" cols="50">(10th ed), Pretrial Proceedings sample 121AA and - and 63 63-5</textarea>
    
    <button class="nbtngreen" onclick="fixtext()">Update</button>

    如果你不想在一个单词内替换,你可以像这样使用单词边界

    elm.value = elm.value.replace(new RegExp('\\b' + key + '\\b', 'g'), mapper.get(key));
    

    【讨论】:

    • 您好,感谢您的帮助。但是,如果我这样做,我会遇到即使它不应该改变值的问题。例如,1=600*;如果我在 textarea 中粘贴 21,它会在不应该的时候将其更改为 2600。这就是我要避免的。先生,我不想听起来忘恩负义,但是,您能教我如何使用我的脚本,并且只为连字符添加一个正则表达式吗?
    • 你可以使用像regexr.com/5kenl这样的单词边界
    【解决方案2】:

    const mapper = new Map();
    mapper.set("10th", "11th");
    mapper.set("-", "Deleted");
    mapper.set("63", "Deleted");
    mapper.set("63-5", "Deleted");
    mapper.set("121AA", "95");
    
    function fixtext() {
      const elm = document.getElementById("textarea1");
      if (elm) {
        elm.value = elm.value
          .replace(
            /\b\d+(?:[A-Z]|([A-Z])\1|d|th|st|nd)?(|\-\d)?\b/g,
            m => mapper.has(m) ? mapper.get(m) : m
          );
      }
    }
    <textarea id="textarea1" rows="4" cols="50">(10th ed), Pretrial Proceedings sample 121AA and - and 63 63-5</textarea>
    
    <button class="nbtngreen" onclick="fixtext()">Update</button>

    【讨论】:

    • 这就是我真正想要的!非常感谢你做的这些!请问一个问题,我怎样才能在列表中添加逗号?例如我想定位mapper.set("1, 3", "Random numbers");?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2019-08-31
    • 2015-09-11
    • 2018-01-11
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多