如何在RegExp中包含变量并排除数字[0-9]和字母[a-zA-Z]



我有一个基于单词生成随机字母的代码,我试图创建一个RegExp代码,将单词中的所有字母转换为'_',但单词中随机生成的字母除外。

const word = "Apple is tasty"
const randomCharacter = word[Math.floor(Math.random() * word.length)]
regex = new RegExp(/[^${randomCharacter}&/\#,+()$~%.'":;*?<>{}s]/gi)
hint = word.replace(regex,'_')

我想把所有的字母都改成'_',除了随机生成的单词。由于某些原因,上面的代码不起作用,并显示了结果:A___e __ ta_t_和我不知道该怎么办。

我想要的最终结果是这样的:A____ __ _a___

regex有没有办法将所有字母和数字'/[^a-zA-Z0-9]/g'更改为'_',除了随机生成的字母?

我列出了我想在上面的代码中包含的所有表达式,因为我无法找到一种方法来使用regex变量同时包含和排除。

不能在RegExp文本(/.../(内部进行字符串插值。这意味着你的占位符${randomCharacter}不会在模板中计算它的值,而是从字面上解释为字符串"${randomCharacter}";。

如果您想使用模板文字,请使用RegExp构造函数初始化regex变量,例如:

const regex = new RegExp(`[^${randomCharacter}&\/\#,+()$~%.'":;*?<>{}\s]`, "gi");

请参阅MDN-RegExp文档,了解文字表示法和构造函数之间的差异,最值得注意的是:

正则表达式对象的构造函数[…]导致正则表达式的运行时编译。当[…]不知道模式并从其他来源(如用户输入(获取时,请使用构造函数。

/(?:[^As])/

在regex101 上测试

只需将[^As]中的A替换为要从替换中提交的字符

演示:

const word = "Apple is tasty";
const randomCharacter = 'a';//word[Math.floor(Math.random() * word.length)];
regex = new RegExp('(?:[^' + randomCharacter + '\s])', 'gi');
hint = word.replaceAll(regex, '_');
console.log(hint)

最新更新