Ваше регулярное выражение правильно. Ваш код/скрипка не работает, потому что строки имеют другой корпус (Racecar
против racecar
).
Если вы также преобразовать переменную nospace
в нижнем регистре, он работает:
function palindrome(str) {
// Good luck!
var nospace = str.replace(" ", "").toLowerCase();
// ^^^^^^^^^^^^^^--- added this
var reverse = str.split('').reverse().join('');
var change = reverse.toLowerCase();
console.log(change);
var regexp = /[^A-Za-z]|\s+/g;
var x = change.replace(regexp, "");
if (nospace == x) {
return true;
} else {
return false;
}
}
console.log(palindrome("Race car"));
См updated fiddle here.
Теперь ваш код может использовать некоторые другие улучшения.
Регулярное выражение "strip all the not a letter" regex (/[^A-Za-z]|\s+/g
) может быть упрощено до /[^A-Za-z]/g
. Но вам это может действительно не понадобиться (я не знаю ваших требований, вам все равно может понадобиться, если ваши требования действительно хотят, чтобы вы удаляли не буквы, а не просто пробелы).
Ваш первый nospace
var заменяет только первое пустое пространство от входа. Используя регулярное выражение, он заменит их все (только сделайте это, если это действительно то, что вы хотели): str.replace(" ", "")
становится str.replace(/\s+/g, "")
.
Кроме того, поскольку вы уже удалили пробелы в nospace, вы можете просто отменить его (вместо того чтобы отменить ввод и позже удалить его пробелы). А потом сравните его.
Также последний if
/else
может быть упрощен до всего лишь return
. Окончательный код будет выглядеть примерно так:
function palindrome(str) {
var nospace = str.replace(/\s+/g, "").toLowerCase();
var reverse = nospace.split('').reverse().join('').toLowerCase().replace(/[^a-z]/g, "");
// optional, depends on your requirements -------------^^^^^^^^^^^^^^^^^^^^^^^^
return nospace === reverse;
}
console.log(palindrome("R a c e c a r")); // output: true
JSFiddle here.
Белые пробелы не являются буквами, поэтому нет необходимости проверять их отдельно. – nnnnnn