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

时间:2016-11-10 18:11:03

标签: javascript regex string

我有一个函数,如果一个字符是标点符号的形式,则返回true,并且我试图编写另一个接受字符串的函数,并在调用第一个函数时删除空格和标点符号。我认为我得到了大部分。但现在我被卡住了。任何帮助表示赞赏。

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
    }

1 个答案:

答案 0 :(得分:1)

一些问题:

  • 内在条件实际上应该是相反的:当 是一个标点字符时你想做什么,即你想要添加它的结果。只有在其他情况下你才想这样做。

  • 调用!compress(i)是错误的:首先,该函数需要一个字符串,而不是一个索引,它返回一个字符串,而不是一个布尔值(所以在它上面执行!) 。看起来你想要递归地调用你的函数,虽然这是一个选项,你迭代字符串。您应该执行以下两种操作之一:递归或迭代。

  • 您在ch函数中引用了一个变量compress,但您尚未在此处定义。

因此,如果您想编写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也发生了奇怪的事情:它在ch表达式中为if指定了一个布尔值。这不会使您的功能出现故障,但该分配没有用处:match方法已经返回了if条件所需的布尔值。

首先评估if中的布尔表达式然后以falsetrue的形式返回相同的值也不是很好看。这可以通过返回已评估的表达式本身来完成:

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

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

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数组方法会使代码非常精简。