带有replace()的正则表达式仅用于字母

6 javascript regex text replace

我有一个输出的字符串

20153 Risk
Run Code Online (Sandbox Code Playgroud)

我想要实现的是只获取字母,我通过使用正则表达式只获取数字来实现

const cf_regex_number = cf_input.replace(/\D/g, '');
Run Code Online (Sandbox Code Playgroud)

这只会返回20153. 但一旦我尝试只获取字母,它就会返回 while 字符串而不是Risk. 我已经完成了我的研究,并且只获取字母的正则表达式正在使用**/^[a-zA-Z]*$/**

这是我的代码行,我试图只获取字母

const cf_regex_character = cf_input.replace(/^[a-zA-Z]*$/,'')
Run Code Online (Sandbox Code Playgroud)

但它没有返回Risk,而是返回20153 Risk,这是字符串的整行。

Gir*_*rpa 6

/[^a-z]+/i

  • 括号表示字符范围[]具体来说,在这种情况az

  • 实际上,该i标志意味着i不区分大小写,因此也包括Ato Z

  • 插入符号^反转模式;这意味着任何不在指定范围内的东西。

  • +只要字符在该范围内,这些方法就会继续将字符添加到匹配中。

  • 然后停止匹配。

实际上,这匹配了 中空格之前的所有内容20153 Risk

然后你用空字符串替换这个匹配'',剩下的就是Risk

const string = '20153 Risk';
const result = string.replace(/[^a-z]+/i, '');
console.log(result);
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 2

您的第一个模式是找到每个非数字并用任何内容替换它。

另一方面,您的第二个模式仅定位模式的第一次出现,并且该模式正在查找string 的开头,后跟字母,然后是 string 的结尾。不存在这样的序列 - 如果从字符串的开头开始,则恰好有零个字母,然后您距离字符串的预期结尾很远。即使这有效,你删除的是字母,而不是非字母。

此模式与第一个模式平行(删除任何出现的非字母):

const cf_regex_character = cf_input.replace(/[^a-zA-Z]/g,'')
Run Code Online (Sandbox Code Playgroud)

但可能更好的方法是提取所需的子字符串,而不是删除不是的所有内容:

const letters = cf_input.match(/[a-z]+/i)[0];
const numbers = cf_input.match(/\d+/)[0];
Run Code Online (Sandbox Code Playgroud)

(这是如果您知道存在这样一个子字符串;如果您不确定,最好编写一些更具防御性的代码。)