首页 > 解决方案 > 如何使用正则表达式替换 .replace 脚本的确切值?

问题描述

我这里有一个通过onclick按钮激活的 javascript 替换脚本。

我正在使用它来轻松替换基于一长串数字的数字。

我正在做的是:

我有这个列表(请知道这是一个样本,还有大约一千个)

.replaceAll("10,", "80,")
.replaceAll("1,", "75,")
.replaceAll("0,", "65,")
.replaceAll("83,", "50,")

如果我在 中输入10textarea,并且如果我单击“更新按钮”,它应该变成80而不是8657565,因为我需要一个准确的值。现在这就是它正在做的事情,将10更改为80,然后将80中的0更改为65

我正在寻找一种使用 RegEx 执行此操作的快速或干净的方法,以添加到脚本中,我只想更改引号中的指定数字,而不是前面或后面的数字。

这是我的示例代码:

function fixTextarea(textarea) {
  textarea.value = textarea.value.replaceAll("3d ed", "4th ed")
    .replaceAll("437,", "511,")
    .replaceAll("438,", "512, 517,")
    
    .replaceAll("21,", "24,")
    .replaceAll("309,", "357,")
    .replaceAll("425,", "491,")
    .replaceAll("427,", "493,")
    .replaceAll("430,", "496-502,")
    
    .replaceAll("10,", "80,")
    .replaceAll("1,", "75,")
    .replaceAll("0,", "65,")
    .replaceAll("83,", "50,")

};

function fixtext() {
  let textarea = document.getElementById("textarea1");
  textarea.select();
  fixTextarea(textarea);
}

window.addEventListener('DOMContentLoaded', function(e) {
  var area = document.getElementById("textarea1");

  var getCount = function(str, search) {
    return str.split(search).length - 1;
  };

  var replace = function(search, replaceWith) {
    if (typeof(search) == "object") {
      area.value = area.value.replace(search, replaceWith);
      return;
    }
    if (area.value.indexOf(search) >= 0) {
      var start = area.selectionStart;
      var end = area.selectionEnd;
      var textBefore = area.value.substr(0, end);
      var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search);
      area.value = area.value.replace(search, replaceWith);
      area.selectionStart = start + lengthDiff;
      area.selectionEnd = end + lengthDiff;
    }
  };

});
<textarea id="textarea1" rows="4" cols="50">Witkin & Epstein, Criminal Law (3d ed), Pretrial Proceedings §§ 10, 438,</textarea>

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

我试过使用类似的东西,.replaceAll("/^10,\z/", "80,")但它似乎不起作用。

我会很感激任何帮助。我被困住了,我真的无法再靠自己解决了。

标签: javascripthtmlregex

解决方案


一种选择可能是创建一个地图,您可以在其中指定要替换的内容。

然后,您可以使用模式来匹配 1 个或多个数字,前面有一个单词边界以防止部分匹配,并使用正向前瞻\b将逗号直接断言到右侧。(?=,)

在replace的回调中,检查字符串是否存在于Map中。如果是,则返回映射值,否则返回原始匹配以使其保持不变。

按下按钮一次即可完成所有更换。

\b\d+(?=,)

正则表达式演示

例如:

const mapper = new Map();
mapper.set("10", "80");
mapper.set("437", "511");
mapper.set("80", "81");

function fixtext() {
  const elm = document.getElementById("textarea1");
  if (elm) {
    elm.value = elm.value
      .replace(
        /\b\d+(?=,)/g,
        m => mapper.has(m) ? mapper.get(m) : m
      );
  }
}
<textarea id="textarea1" rows="4" cols="50">Witkin & Epstein, Criminal Law (3d ed), Pretrial Proceedings §§ 10,438, this should not change 437 and this should: 437,9999</textarea>

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


推荐阅读