[英]Remove spaces from a string, special characters and convert it to lowercase
[英]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
對布爾表達式求值,然后以false
和true
的形式返回相同的值,看起來也不是很好。 您可以通過只返回評估表達式本身來做到這一點:
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.