改进链式正则表达式以替换元音

我收到了一个JavaScript代码挑战,以创建一个函数,该函数将用 0、1、2、3、4(分别)替换字符串中 a、e、i、o、u 的所有实例。例如,“这个字符串怎么样?” 应该变成“H3w 0b34t th2s str2ng?”

这是我解决问题的方法:

const hackerSpeak = (str) => {
return str.replace(/[aA]/g, 0).replace(/[eE]/g, 1).replace(/[iI]/g, 2).replace(/[oO]/g, 3).replace(/[uU]/g, 4)
}

我对 RegEx 相当陌生,并且发现自己想知道是否有一种更简单的方法可以避免链接。我可以将 RegEx 组合成一个表达式,分别用 01234 替换 aeiou 吗?

这个问题的答案让我研究了捕获组和反向引用,但这似乎是为了重新排序/交换 aeiou 字符,而不是用 01234 替换它们。(虽然我很高兴得到纠正。)

回答

您可以replace与回调一起使用。

const hackerSpeak = (str) => {
    return str.replace(/[aeiou]/gi, x => 'aeiou'.indexOf(x.toLowerCase()));
}

来自Pointy 的评论:

为了添加一些细节,每个匹配项都会传递回调函数。回调函数返回.replace()应该用来替换字符串匹配部分的内容。在这里,gi正则表达式上的后缀使其成为“全局”匹配,因此.replace()将继续尝试直到源字符串的末尾,并i使其忽略大小写(因此大写和小写都匹配)。

  • 为了添加一些细节,每个匹配项都会传递回调函数。回调函数返回 `.replace()` 应该用来替换字符串匹配部分的内容。在这里,正则表达式上的 `gi` 后缀使其成为“全局”匹配,因此 `.replace()` 将继续尝试直到源字符串的末尾,而 `i` 使其忽略大小写(因此大写和小写两者匹配)。

以上是改进链式正则表达式以替换元音的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>