Источник вашей ошибки "_- \ 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$
Обратите внимание, что между скобками ни один из этих символов не следует заключать в кавычки, даже якорные символы и скобки.
Но если вы хотите попробовать все из них, добавьте их в исходный источник строка, вы должны изменить верхний предел количества повторений на большее значение. В противном случае последовательность сопоставляемых символов будет слишком длинной и не будет совпадать исключительно по этой причине.
Обратите также внимание, что $ , завершающий все регулярное выражение, является якорем (соответствует концу исходной строки), а не буквально $ .