我试图通过使用正则表达式范围来避免数组和循环,但是,我只想替换该范围中每个字符的第一个实例一次。
我使用范围是因为我无法保证顺序并且无法重新排序。
例如:
"access".replace(/[access]/g, '') = "cs",而不是 ""。
"cellphones".replace(/[el]/g) = "clphones", 而不是 "cphons"
正则表达式范围内的 double 无论如何都是多余的,在这种情况下,它也不应该导致第二次出现被替换。
如果这不可能,那么我就得想点别的办法了。
最佳答案
这需要进行向后查找,以查看该字符是否较早出现并因此应保留。但JS不支持这一点。搜索“JS Look-behind regexp”以获得一些想法。经典的方法是反转字符串,以便您可以使用前瞻:
const rev = s => s.split('').reverse().join('');
const testData = [
["access", 'access'],
["cell phones", 'el']
];
function match(s, chrs) {
const reg = new RegExp(`([${chrs}])(?!.*\\1)`, "g");
return rev(rev(s).replace(reg, ''));
}
testData.forEach(([input, chrs]) => console.log("input", input, "gives", match(input, chrs)));
关于javascript - 正则表达式 - 匹配范围,但每个唯一字符仅匹配一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42755011/