我试图删除所有的连续数字使用完全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)
4条答案
按热度按时间qni6mghb1#
为了回答你的问题,你的第一个代码片段使用了一个正则表达式文字,它不能接受来自脚本的变量。
...将匹配目标字符串中
'ii'
的任何匹配项。实现此功能的唯一方法是使用第二个代码片段中演示的
RegExp()
构造函数。如果您的问题背后的动机是更干净的代码,那么下面是一个替代方法:
正则表达式中的LookbehindAssert和捕获组使得这样的情况变得非常简单。
Here is the Regex101 link for your testing。
希望这对你有帮助。
irlmq6kh2#
我认为语义上正确的方法是使用命名组。它允许您匹配一个模式,然后在稍后的匹配中引用该模式,因此它允许您轻松地识别重复项。
说明:它匹配了一个数字\d,用()将其分组,并给它一个名字(在本例中是“number”),然后我可以用\k引用这个匹配,这样我就可以看到相同的匹配再次出现在哪里。
然后,replace with $1会将整个内容(在本例中为两个匹配项,用空格分隔)替换为组。
您可以在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Backreferences
xbp102n03#
使用match groups and back-references可以更容易地实现这一点。只需创建一个匹配任意数字的匹配组,然后至少重复该组一次。要实现这一点,您还需要添加一个尾随空格,以便匹配最后一个数字,但稍后删除该空格。如下所示:
这个方法也会保留空格。如果你需要删除空格,那么你可以简单地把它们从结果中去掉,如下所示:
我将这种方法与damonholden's answer进行比较,发现它通常更快(运行多次,堆栈片段有点挑剔):
xtfmy6hx4#