Проверка строки на наличие только указанных символов
Требуется осуществить проверку, что в строке присутствуют только символы a-z, 0-9 и -. Я понимаю, как осуществить проверку на наличие этих символов:
if((/[a-z0-9\-]/.test(teststring))
Но как исключить в проверке все прочие? Также вопрос - корректно ли данное регулярное выражение?
Ответы (3 шт):
Вы можете добавить квантификатор и условия начала и конца строки:
/^[a-z0-9-]+$/
Тогда будут подходить только строки, состоящие из этих символов. Если заглавные буквы тоже принимаются, добавьте флаг игнорирования регистра:
/^[a-z0-9-]+$/i
Если дефис стоит в конце, его можно не экранировать.
У Вас /[a-z0-9\-]/ принимает только один символ 0-9, a-z либо -. Нам же надо, чтобы проверялась вся строка. Как уже уточнили, надо добавить символы ^ (начало строки) и $ (конец строки). Также надо указать +, [a-z0-9\-]+, что означает "один или больше" символ.
Чтобы протестировать на все другие символы можно указать так: ^(?![a-z0-9-]+$).*$, где (?!) означает "вперед смотрящее нет".
const tests = ['1-2', '2a*3', '4b-0', '4!+2', '!+$'];
console.log(tests.map(e => /^[a-z0-9-]+$/.test(e))); // принимает a-z, 0-9, -
console.log(tests.map(e => /^(?![a-z0-9-]+$).*$/.test(e))); // принимает все то, что не было принято выше
Метод RegExp#test проверяет строку на наличие совпадения в любом её месте, т.е. /[a-z0-9-]/ найдёт совпадение и в a-1, и в a-1~!@#$%^&*всё-тут-может-быть—()_+|.
В данном случае необходимо просто инвертировать символьный класс:
if (/[^a-z0-9-]/.test(teststring)) {
// ^ - тут
console.log("Формат строки неверен.");
} else {
console.log("Формат строки правилен.");
}
/[^a-z0-9-]/.test(teststring) вернёт true, если в строке есть символы, отличные от указанных в исключающем символьном классе (букв, цифр и дефиса), и false, если таких символов нет.
Обратите внимание
Если нет возможности "инвертировать" результат проверки на совпадение, используйте проверку на совпадение целой строки с помощью "якорей" ^ и $:
if (/^[a-z0-9-]*$/.test(teststring))
if (/^[a-z0-9-]+$/.test(teststring))
Квантификатор * требует наличия 0 и более повторов шаблона, и поэтому /^[a-z0-9-]*$/ разрешает пустую строку. Квантификатор + требует наличия 1 и более повторов шаблона, и поэтому /^[a-z0-9-]+$/ НЕ разрешает пустую строку.
Пример кода:
const strings = ['a-1', '1a', 'a-%^&', '2+2'];
const regex = /[^a-z0-9-]/;
strings.forEach( teststring => {
if (regex.test(teststring)) {
console.log(`Формат строки '${teststring}' неверен.`);
} else {
console.log(`Формат строки '${teststring}' правилен.`);
}
}
)