gpt4 book ai didi

javascript - 正则表达式全局替换不替换第一次出现的情况

转载 作者:行者123 更新时间:2023-12-03 05:11:32 25 4
gpt4 key购买 nike

我正在尝试进行快速而肮脏的模板测试,但是当正则表达式替换时,它只替换最后一个出现的位置,我认为 \g 会替换所有副本。但它只匹配最后一次出现的情况。

( How to String.match() distinct it ${SOME_TEXT} using Regex )

我想做的是为每个唯一的变量名称提示用户一次。

Title = t
name = n
result = '${Title} - n - t'

使用 /\$\{([^\}]+)\}/g 有效,但会多次提示用户。

Title = t
name = n
Title = t
result = 't - n - t'

那么我如何才能将每个标记替换为单个值,无论它出现多少次。

<html>
<head>
<script type="application/javascript">

window.copyToClipboard = function(n) {
var u = "_hiddenCopyText_", t, i, r;
t = document.getElementById(u);
t.textContent = n;
i = document.activeElement;
t.focus();
t.setSelectionRange(0, t.value.length);
try {
r = document.execCommand("copy")
} catch (f) {
r = !1
}
return i && typeof i.focus == "function" && i.focus(),
t.textContent = "",
r
};
//${varname}
window.templateRegex = /\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g;
window.test = " ${Title} - ${Name} - ${Title}"
window.copyTemplate = function (template) {
var result = template.replace(window.templateRegex, function(match, token){
return window.prompt("replace value for ${"+token+"}","${"+token+"}");
});
window.copyToClipboard(result);
};

</script>
</head>
<textarea id="_hiddenCopyText_"></textarea>
<button onclick="copyTemplate(window.test)">Test</button>
</html>

JsFiddle https://jsfiddle.net/ksu37c3b/

最佳答案

如果相同的${..}(${Title})出现多次,/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g 只会匹配最后一个。要匹配所有元素, /\$\{([^\}]+)\}/g 可以工作,它不需要负向先行 (?![\S\s]*\$\{\1\})
在字符串 "${Title} - ${Name} - ${Title}" 中,仅 ${Name}${Title} > 匹配模式,因为第一个和最后一个是相同的,如果你改变字符串,例如 "${Title2} - ${Name} - ${Title}" 就可以了将匹配所有元素,因为 ${Title2} 和 ${Title} 不相等。这就是 (?![\S\s]*\$\{\1\}) 尝试做的事情,如果最后一个 ${..} 和当前的 ${..} 相同,不会匹配。

更新

So how can I replace each token with a single value no matter how many times it appears.

您可以使用match()方法获取出现的标记数组,然后将其一一替换,下面的代码将起作用:

window.templateRegex = /\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g;
window.test = " ${Title} - ${Name} - ${Title}";
var userinput, reg, i;
var arr = window.test.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g);
for (i = 0; i < arr.length; i++) {
arr[i] = arr[i].replace(/[\$\{\}]/g, "");
userinput = window.prompt("replace value for " + arr[i]);
reg = new RegExp("\\$\\{" + arr[i] + "\\}", 'g');
console.log(reg);
window.test = window.test.replace(reg, userinput);
}
alert(window.test);

我已将您的代码修改如下:

window.copyToClipboard = function(n) {
var u = "_hiddenCopyText_",
t, i, r;
t = document.getElementById(u);
t.textContent = n;
//** snip **//
};
//${varname}
window.templateRegex = /\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g;
window.test = " ${Title} - ${Name} - ${Title}";
window.copyTemplate = function(template) {
var result = template;
var userinput, reg;
var arr = result.match(/\$\{([^\}]+)\}(?![\S\s]*\$\{\1\})/g);
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i].replace(/[\$\{\}]/g, "");
userinput = window.prompt("replace value for " + arr[i]);
reg = new RegExp("\\$\\{" + arr[i] + "\\}", 'g');
console.log(reg);
result = result.replace(reg, userinput);
}
window.copyToClipboard(result);
};
<textarea id="_hiddenCopyText_"></textarea>
<button onclick="copyTemplate(window.test)">Test</button>​

关于javascript - 正则表达式全局替换不替换第一次出现的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41798489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com