javascript - 正则表达式 - 匹配范围,但每个唯一字符仅匹配一次

标签 javascript regex regex-lookarounds

我试图通过使用正则表达式范围来避免数组和循环,但是,我只想替换该范围中每个字符的第一个实例一次。

我使用范围是因为我无法保证顺序并且无法重新排序。

例如:

"access".replace(/[access]/g, '') = "cs",而不是 ""。 "cellphones".replace(/[el]/g) = "clphones", 而不是 "c​​phons"

正则表达式范围内的 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/

相关文章:

javascript - 刷新后保持 WebSocket 连接处于事件状态

java - 将字母数字字符串转换为数字和字符串映射时生成的空映射

javascript - 删除括号前后的所有空格

php - 正则表达式跳过一个标签,如果它在另一个标签内

javascript - ace 编辑器非捕获组问题(?:)

javascript - 如何将 JavaScript 日期字符串转换为另一种格式?

javascript - 如何查找包含出现次数最多的值的对象的数组内的值(深度模式)?

Javascript 执行函数 onload 但不触发按钮的 onclick 事件

正则表达式使用现有数据从 ipconfig 中提取数据

正则表达式 - 分隔符后的字符,仅限于数字