regex 删除连续相同数字的正则表达式

lokaqttq  于 2022-12-01  发布在  其他
关注(0)|答案(4)|浏览(142)

我试图删除所有的连续数字使用完全RegEx与JS。我尝试了两种方式,第二个通过,但我想知道什么是错误的第一个
第一次尝试:

let a = "1 2 3 3 4 5 5 6 7 8 8 9";
a = a.split(" ").join("");
for (let i of a) {
  a = a.replace(/ii/g, i);
}

console.log(a)

第二个

let a = "1 2 3 3 4 5 5 6 7 8 8 9";
a = a.split(" ").join("");
for (let i of a) {
  a = a.replace(new RegExp(`(${i})(${i})`, "g"), "$1");
}

console.log(a)
qni6mghb

qni6mghb1#

为了回答你的问题,你的第一个代码片段使用了一个正则表达式文字,它不能接受来自脚本的变量。

/ii/g

...将匹配目标字符串中'ii'的任何匹配项。
实现此功能的唯一方法是使用第二个代码片段中演示的RegExp()构造函数。
如果您的问题背后的动机是更干净的代码,那么下面是一个替代方法:
正则表达式中的LookbehindAssert和捕获组使得这样的情况变得非常简单。

const removeSequentialNumbers = (string) =>
  string.replaceAll(/(?<=(?<number>\d))(\s\k<number>)/g, '');

Here is the Regex101 link for your testing
希望这对你有帮助。

irlmq6kh

irlmq6kh2#

我认为语义上正确的方法是使用命名组。它允许您匹配一个模式,然后在稍后的匹配中引用该模式,因此它允许您轻松地识别重复项。

a.replaceAll(/(?<number>\d)\s\k<number>/g, "$1")

说明:它匹配了一个数字\d,用()将其分组,并给它一个名字(在本例中是“number”),然后我可以用\k引用这个匹配,这样我就可以看到相同的匹配再次出现在哪里。
然后,replace with $1会将整个内容(在本例中为两个匹配项,用空格分隔)替换为组。
您可以在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Backreferences

let a = "1 2 3 3 4 5 5 6 7 8 8 9"; 
const result = a.replaceAll(/(?<number>\d)\s\k<number>/g, "$1")
console.log(result)
xbp102n0

xbp102n03#

使用match groups and back-references可以更容易地实现这一点。只需创建一个匹配任意数字的匹配组,然后至少重复该组一次。要实现这一点,您还需要添加一个尾随空格,以便匹配最后一个数字,但稍后删除该空格。如下所示:

let a = "1 2 3 3 4 5 5 6 7 8 8 9";
let b = (a + ' ').replace(/([1-9]\s)\1+/g, '$1').slice(0, -1);

console.log(b)

这个方法也会保留空格。如果你需要删除空格,那么你可以简单地把它们从结果中去掉,如下所示:

let a = "1 2 3 3 4 5 5 6 7 8 8 9";
let b = (a + ' ').replace(/([1-9]\s)\1+/g, '$1').replaceAll(' ', '');

console.log(b)

我将这种方法与damonholden's answer进行比较,发现它通常更快(运行多次,堆栈片段有点挑剔):

let a = "1 2 3 3 4 5 5 6 7 8 8 9";

console.time()
console.log(a.replaceAll(/(?<=(?<number>\d))(\s\k<number>)/g, ''));
console.timeEnd()

console.time()
console.log((a + ' ').replace(/([1-9]\s)\1+/g, '$1').slice(0, -1));
console.timeEnd();
xtfmy6hx

xtfmy6hx4#

let a = "1 2 3 3 4 5 5 6 7 8 8 9";

a = a.split(" ").join("");
let b = a.replace(/(.)\1+/g, '$1');
let c = b.split("").join(" ")

console.log(c)

相关问题