2016-07-31 2 views
0

Я пытаюсь создать регулярное выражение для поиска чего-либо, что не является буквой, и я также хочу обнаружить любые пробелы в моей строке. Я просмотрел документацию MDN, видеоролики youtube и вопросы о стеке, и я до сих пор не понимаю. Не могли бы вы указать мне в правильном направлении? Вот jsfiddle (это функция для палиндромов.): https://jsfiddle.net/jn2tutty/71/Регулярные выражения/javascript

Вот код:

var regexp = /[^A-Za-z]|\s+|/g;

+0

Белые пробелы не являются буквами, поэтому нет необходимости проверять их отдельно. – nnnnnn

ответ

0

Ваше регулярное выражение правильно. Ваш код/​​скрипка не работает, потому что строки имеют другой корпус (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.

+0

Да, хороший момент. Я думал об обновлении ответа этим замечанием. Думаю, я сейчас, спасибо! – acdcjunior

+0

Спасибо большое. Это очень помогло. Я еще учусь :) –

1

Этот подход отбрасывает все, кроме букв, и использует цикл for для изменения строки.

var str = ' some123 text -&'; 
str = str.replace(/[^a-z]/gi,'').toLowerCase(); 
console.log(str); 
var i,reversed = ''; 
for (i = str.length-1; i > -1; i--) { 
     reversed += str[i]; 
} 
if (str === reversed) { 
     console.log('palindrome'); 
} else { 
     console.log('not a palindrome'); 
} 
Смежные вопросы