簡體   English   中英

如何從字符串中刪除空格和特殊字符?

[英]How to remove spaces and special characters from 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
    }

一些問題:

  • 內部條件實際上應該相反:當它標點符號時,您希望執行任何操作,即,您不想將其添加到結果中。 只有在其他情況下,您才想這樣做。

  • 調用!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數組方法如何使代碼相當精簡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM