javascript - 如何使用正则表达式替换 .replace 脚本的确切值?
问题描述
我这里有一个通过onclick
按钮激活的 javascript 替换脚本。
我正在使用它来轻松替换基于一长串数字的数字。
我正在做的是:
我有这个列表(请知道这是一个样本,还有大约一千个)
.replaceAll("10,", "80,")
.replaceAll("1,", "75,")
.replaceAll("0,", "65,")
.replaceAll("83,", "50,")
如果我在 中输入10textarea
,并且如果我单击“更新按钮”,它应该变成80而不是865或7565,因为我需要一个准确的值。现在这就是它正在做的事情,将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,")
但它似乎不起作用。
我会很感激任何帮助。我被困住了,我真的无法再靠自己解决了。
解决方案
一种选择可能是创建一个地图,您可以在其中指定要替换的内容。
然后,您可以使用模式来匹配 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>
推荐阅读
- apache - 无法使用 ReCaptcha 2 解决 Content-Security-Policy 问题
- r - 允许 Shiny 交互式 Web 应用程序中的 numericInput() 使用逗号进行输入(适用于欧洲用户)
- sql - 根据 PostgreSQL 中的条件将值插入新数组列
- javascript - 当 express.js 提供服务时,HTML 元视口标记被忽略
- react-native - React Native Enzyme Jest props.onPress 不是函数
- node.js - 如何检查 Azure Blob createReadStream 的错误?
- angular - Angular5 - 如何在不丢失数据的情况下返回?
- r - 使用 1:n 子集数据表
- html - CSS 网格 - 跨度重叠,无法内联
- linux - Apache Atlas - 如何在 EMR 上安装以及如何更改用户/密码