如何从字符串中删除空格和特殊字符

How to remove spaces and special characters from string?

本文关键字:空格 特殊字符 删除 字符串      更新时间:2023-09-26

我有一个函数,如果一个字符是一种标点符号形式,我正在尝试编写另一个函数,该函数接受字符串并在调用第一个函数时删除空格和标点符号。我想我得到了大部分。但现在我被困住了。任何帮助,不胜感激。

var isPunct = function(ch) {
    if (ch = ch.match(/[,.!?;:'-]/g))
        return true
    else
        return false
}
//B
var compress = function(s) {
    var result = "";
    //loop to traverse s
    for (var i = 0; i < s.length; i++) {
        if (!(isPunct(ch));
            //(isPunct(s.charAt(i) || s.charAt(i) == " "));
            //do nothing
            else
                result = result + !compress(i)
        }
        return result
    }

一些问题:

  • 实际上,内在条件应该是相反的:当它是标点符号时,您不想执行任何操作,即您不想将其添加到结果中。只有在其他情况下,您才想这样做。

  • 调用!compress(i)是错误的:首先,该函数需要一个字符串,而不是索引,它返回一个字符串,而不是一个布尔值(以便对其执行!(。似乎您想递归调用函数,尽管这是一个选项,但您也在迭代字符串。您应该执行以下两项之一:递归或迭代。

  • 您在 compress 函数中引用了尚未在此处定义的变量ch

因此,如果要compress迭代方式编写,请按如下方式更改代码:

var compress = function(s) {
    var result = "", ch; // define ch.
    //loop to traverse s
    for (var i = 0; i < s.length; i++) {
        ch = s[i]; // initialise ch.
        if (!isPunct(ch)) result = result + ch; // only add when not punctuation
    }
    return result;
}

另一方面,如果你想保持对compress的递归调用,那么你应该取消你的for循环:

var compress = function(s) {
    var result = "", ch, rest;
    if (s.length == 0) return '';
    result = compress(s.substr(1)); // recursive call
    ch = s[0];
    if (!isPunct(ch)) result = ch + result;
    return result;
}

该函数isPunct还发生了一件奇怪的事情:它将布尔值分配给if表达式中的ch。这不会使您的函数出现故障,但该赋值没有任何用处:match 方法已经返回了if条件所需的布尔值。

首先在if中计算布尔表达式,然后以 falsetrue 的形式返回相同的值,这也不太好看。您可以通过返回计算的表达式本身来完成此操作:

var isPunct = function(ch) {
    return ch.match(/[,.!?;:'-]/g);
}

最后一点,如果您只在 compress 中使用 isPunct 函数,则实际上并不需要它。整个逻辑只能在一个函数中执行,如下所示:

let compress = s => s.replace(/[,.!?;:'-]/g,'');
// Demo:  
console.log(compress('a,b,c')); // abc

如果您希望保留isPunct并且不想在其他地方重复正则表达式,则可以像这样进行替换:

let isPunct = ch => ch.match(/[,.!?;:'-]/g);
let compress = s => Array.from(s).filter(ch => !isPunct(ch)).join('');
// Demo:  
console.log(compress('a,b,c')); // abc

请注意,使用 ES6 箭头函数和 ES5 数组方法如何使代码非常精简。