【问题标题】:How do I filter out a string to contain only letters in vanilla Javascript? [duplicate]如何过滤掉字符串以仅包含香草Javascript中的字母? [复制]
【发布时间】:2023-03-10 11:40:02
【问题描述】:

我得到了这个字符串:

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" || ...

标签: javascript arrays string function loops


【解决方案1】:

一个简单的方法可能是像这样使用正则表达式

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)


【讨论】:

  • 我认为,由于 OP 是初学者,因此帮助他们处理现有代码而不是给他们新的东西对他们更有帮助。
  • 我也给出了解释。我相信这可能是他们学习 javascript 可以提供的功能的好方法。但是您确实有一个有效的观点,我将更新代码以添加 OP 使用的内容
  • 我认为他想要一个基于问题的字符数组。如果它是一个字符串,你可以替换特殊字符@AZ_
  • 他最后没有使用join()
  • 你也可以message.replace(/[^a-z]+/gi, '').split('')
【解决方案2】:

您可以取一个小写字符串,将其拆分并检查每个字符的值是否大于或等于'a' 且小于或等于'z'

最后,过滤后,您可以通过将数组与一个空字符串作为胶水连接起来来返回一个字符串。

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

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

【讨论】:

    【解决方案3】:

    您只需使用String.prototype.match 即可仅获取字母数组。

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

    【讨论】:

    • 它是 String.prototype.match。不是数组
    • @DhananjaiPai 哎呀!错别字
    【解决方案4】:

    由于 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 2014-03-08
      • 1970-01-01
      • 2018-01-31
      • 2020-01-29
      • 2021-12-18
      • 1970-01-01
      • 2014-06-21
      相关资源
      最近更新 更多