Что не так с этим регулярным выражением, определяющим заданные c буквы? - PullRequest
0 голосов
/ 10 апреля 2020

Я хотел бы найти результат, который включает все буквы, цифры, подчеркивание, дефис, специальные символы , пробел ... (все возможные символы) между указанными c буквами. Поэтому я придумываю

/^(specific)[a-zA-Z0-9_-\s]{1,20}(letters)$/

ожидаемый результат: конкретизирован c asf124AD_-G букв

который я получил "Недопустимые выражения req. Неверный класс символов".

Я искал в Google, но все еще не уверен, что исправить. Любой комментарий будет полезен! Спасибо!

1 Ответ

2 голосов
/ 10 апреля 2020

Источник вашей ошибки "_- \ s", который интерпретируется как любой символ между "_" и любым белым символом.

Проблема в том, что "-" между скобками означает диапазон символов между предыдущим и последующим символами, но оба эти символа должны быть одинарными символами, не например, "\ s" означает любой белый символ .

Приведенное выше правило не применяется, когда "-" равно:

  • первый / последний символ в скобках,
  • в кавычках, например, с "\",

поэтому, чтобы исправить свое регулярное выражение, переместите этот минус, например, в последнюю позицию, непосредственно перед закрытием "]".

Еще одно замечание: нет смысла использовать группы захвата для захвата фиксированного текст.

Такой фиксированный текст (для соответствия) следует оставить один, а другой текст следует поместить в группу (или группы) захвата.

Так Я думаю, что вы должны использовать следующее регулярное выражение:

^specific([\w\s-]{1,20})letters$

Подробности:

  • ^specific - начало строки и spe cifi c,
  • ( - начало группы захвата, содержащей:
    • [\w\s-] - любое из: word char (letter, di git и "_ "), белый символ (пробел, Tab, NewLine) или минус,
    • {1,20} - число повторений,
  • ) - конец группы захвата,
  • letters$ - буквы и конец строки.

Рабочий пример см .: https://regex101.com/r/MHLubC/1

Чтобы захватить "другие" символы, упомянутые в вашем комментарии, добавьте их перед"-", чтобы оно оставало свою последнюю позицию в скобках.

Итак, все регулярное выражение теперь:

^specific([\w\s\\~!@#$%^&*()+=?-]{1,20})letters$

Обратите внимание, что между скобками ни один из этих символов не следует заключать в кавычки, даже якорные символы и скобки.

Но если вы хотите попробовать все из них, добавьте их в исходный источник строка, вы должны изменить верхний предел количества повторений на большее значение. В противном случае последовательность сопоставляемых символов будет слишком длинной и не будет совпадать исключительно по этой причине.

Обратите также внимание, что $ , завершающий все регулярное выражение, является якорем (соответствует концу исходной строки), а не буквально $ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...