Проверка строки на наличие только указанных символов

Требуется осуществить проверку, что в строке присутствуют только символы a-z, 0-9 и -. Я понимаю, как осуществить проверку на наличие этих символов:

if((/[a-z0-9\-]/.test(teststring))

Но как исключить в проверке все прочие? Также вопрос - корректно ли данное регулярное выражение?


Ответы (3 шт):

Автор решения: vsemozhebuty

Вы можете добавить квантификатор и условия начала и конца строки:

/^[a-z0-9-]+$/

Тогда будут подходить только строки, состоящие из этих символов. Если заглавные буквы тоже принимаются, добавьте флаг игнорирования регистра:

/^[a-z0-9-]+$/i

Если дефис стоит в конце, его можно не экранировать.

→ Ссылка
Автор решения: entithat

У Вас /[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))); // принимает все то, что не было принято выше

→ Ссылка
Автор решения: Wiktor Stribiżew

Метод 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}' правилен.`);
    }
  }
)

→ Ссылка