Я пытаюсь создать тест Regex в JavaScript, который проверит строку, содержащую любой из этих символов:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Дополнительная информация, если вам интересно :)
Я работаю над довольно классным приложением для смены пароля. Если вам интересно, вот остальная часть кода.
У меня есть таблица, в которой перечислены требования к паролю, и по мере того, как конечные пользователи вводят новый пароль, он проверяет массив регулярных выражений и ставит галочку в соответствующей строке таблицы, если он ... проверяется :) Мне просто нужно добавить этот вместо 4-го элемента в validation
массиве.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Да, есть также соответствующая проверка на стороне сервера!
javascript
jquery
regex
пиксельбобби
источник
источник
.addClass("check")
и.removeClass("check")
? И видениеif (someBoolean == true)
кода всегда заставляет меня съеживаться. Просто сделайif (someBoolean)
. Или, еще лучше, просто сделай$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Ответы:
Регулярное выражение для этого действительно простое. Просто используйте класс персонажа. Дефис - это специальный символ в классах символов, поэтому он должен быть первым:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/
Вам также необходимо экранировать другие метасимволы регулярного выражения.
Изменить: дефис является особенным, потому что его можно использовать для обозначения диапазона символов. Этот же класс символов можно упростить с помощью диапазонов:
/[$-/:-?{-~!"^_`\[\]]/
Есть три диапазона. '$' в '/', ':' в '?' и '{' в '~'. последняя строка символов не может быть представлена более просто диапазоном:! "^ _` [].
Используйте таблицу ACSII, чтобы найти диапазоны для классов символов.
источник
\Q
и\E
не работают в движке JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
Самый простой и кратчайший способ добиться этого:
Объяснение
[^...]
Соответствует одному символу, отсутствующему в списке ниже\p{L}
=> соответствует любой букве на любом языке\d
=> соответствует цифре от нуля до девяти\s
=> соответствует любому невидимому символу@#
=>@
и#
символыНе забудьте передать
u
флаг (unicode).источник
^
нужен, когда мы употребляем\w
и\s
маленькими буквами.w
либо снаружиs
, и поскольку эти двое на самом деле не пересекаются, он просто пропускает всех персонажей? (Таким образом, ничего не фильтруя.)/[\W\S]/
), пропускает все. Более точное представление о том, что, как я полагаю, имел в виду Амир, было бы[^\w\s]
. В первом случае регулярное выражение говорит: «сопоставить все, что не является буквенно-цифровым ИЛИ , не является пробелом», что, как вы упомянули, позволяет выполнить все, поскольку буквенно-цифровые символы не являются пробелами и наоборот. Последний говорит: «Сопоставьте все, что не является буквенно-цифровым и не является пробелом». Конечно, существуют исключения, когда акцентированные символы (например,À
) сопоставляются[^\w\s]
.Ответ
Объяснение
Это создает класс символов, удаляющий символы слова, пробелы и добавляющий обратно символ подчеркивания (поскольку подчеркивание является символом «слова»). Остались только спецсимволы. Заглавные буквы представляют собой отрицание их букв в нижнем регистре.
\W
выберет все символы, кроме "слова", эквивалентно[^a-zA-Z0-9_]
\S
выберет все символы, не являющиеся "пробелами", эквивалентно[ \t\n\r\f\v]
_
выберет "_", потому что мы инвертируем его при использовании,\W
и необходимо добавить его обратно висточник
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict const hasSpecial = password => { const specialReg = new RegExp( '^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])', ); return specialReg.test(password); };
источник
RegExp
конструктор, если можно просто использовать литерал регулярного выражения. Гораздо меньше ускользающей работы (большая часть которой в любом случае не нужна), но к тому же она более эффективна.Простой способ добиться этого - отрицательный набор [^ \ w \ s]. По сути, это улавливает:
По какой-то причине [\ W \ S] не работает так же, он не выполняет никакой фильтрации. Комментарий Заэля к одному из ответов дает некоторое объяснение.
источник
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Замените все последние с любого языка на 'A', и, если вы хотите, например, все цифры на 0:
return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");
источник