如何使用普通的Javascript筛选一个字符串只包含字母?

4

我被给予了这个字符串:

var myMessage = "Learning is fun!"

这是我尝试创建仅包含字母的数组(不包括空格和“!”)的方式。
var myMessage = "Learning is fun!";
var arr1 = myMessage.split("");

function onlyLetters(array){
    let arr2 = []
    for(let i = 0; i < array.length; i++){
        if(array[i] === "a" || "b" || "c" || "d" || "e" 
        || "f" || "g" || "h" || "i" || "j" || "k" || "l" 
        || "m" || "n" || "o" || "p" || "q" || "r" || "s" 
        || "t" || "u" || "v" || "w" || "x" || "y" || "z"){
          arr2.push(array[i])
        }
    }
    return arr2
}

console.log(onlyLetters(myMessage))

我做错了什么?另外,是否有一种缩写方式可以列出字母“a”到“z”?

你不能这样写 array[i] === "a" || "b" || ....,因为 === 右侧的表达式会被解析成 "a" || "b" || ....。你应该这样写 array[i] === "a" || array[i] === "b" || ... - ninesalt
4个回答

7
一种简单的方法可能是使用正则表达式,如下所示。
let message = "Learning is fun!";
let onlyLettersArray = message.split('').filter(char => /[a-zA-Z]/.test(char));
console.log(onlyLettersArray)

.filter方法接受一个数组,并在元素上运行一个返回true或false的函数。如果返回false,则该项将被删除。 正则表达式检查字符是否在a-z或A-Z范围内。

另一种方法是过滤字符,然后像这样拆分它

let message = "Learning is fun!";
let onlyLettersArray = message.replace(/[^a-z]+/gi, '').split('');
console.log(onlyLettersArray)

编辑:

var myMessage = "Learning is fun!";
var arr1 = myMessage.split("");

function onlyLetters(array){
    let arr2 = []
    for(let i = 0; i < array.length; i++){
        if(/[a-z]/.test(array[i])){ // you can use regex instead of all characters
          arr2.push(array[i])
        }
    }
    return arr2
}

console.log(onlyLetters(myMessage))

更新: 如果您需要替换字符串中的特殊字符而不是字符数组,则可以编写:

let message = "Learning is fun!";
let letterMessage = message.replace(/[^a-zA-Z]/gm,"")
console.log(letterMessage)



2
我认为,由于OP是初学者,帮助他们改进现有的代码比给他们新的代码更有帮助。 - ninesalt
我已经给出了解释。我相信这可能是他们学习JavaScript可以提供的功能的好方法。但你确实有一个有效的观点,我会更新代码以添加OP所使用的内容。 - Dhananjai Pai
我认为他想要一个基于问题的字符数组。如果它是一个字符串,你可以替换特殊字符@AZ_。 - Dhananjai Pai
他最后没有使用join()函数。 - Dhananjai Pai
1
你也可以使用 message.replace(/[^a-z]+/gi, '').split('') - ninesalt
是的,@ninesalt,这样更有意义。 - Dhananjai Pai

2
你可以使用 String.prototype.match 来获取仅包含字母的数组。

let arr = "Learning is fun!  1233  ashdgahsgdh".match(/[A-Za-z]/g);
console.log(arr)


它是String.prototype.match。不是数组。 - Dhananjai Pai
1
@DhananjaiPai 哎呀!打错字了。 - AZ_

0
你可以取一个小写字符串,分割它并检查每个字符是否大于或等于'a'且小于或等于'z'
最后,在过滤后,你可以通过使用空字符串作为粘合剂将数组连接起来得到一个字符串。

function onlyLetters(string) {
    return string
        .toLowerCase()
        .split("")
        .filter(c => c >= 'a' && c <= 'z')
        .join('');
}

console.log(onlyLetters("Learning is fun!"));


0

鉴于 OP 是初学者,我建议另一种不使用正则表达式的解决方案。

var myMessage = "Learning is fun!";
var arr1 = myMessage.split("");

function onlyLetters(array){
let arr2 = []
for(let i = 0; i < array.length; i++){
    if(isLetter(array[i])){
      arr2.push(array[i])
    }
}
   return arr2
}

function isLetter(c) {
   return c.toLowerCase() != c.toUpperCase();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接