Регулярное выражение для разрешения знаков препинания и пробелов между словами

Мне нужно регулярное выражение, которое предотвращает пробелы и разрешает только буквы и цифры со знаками препинания (испанский). Приведенное ниже регулярное выражение отлично работает, но не позволяет использовать знаки препинания.

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

Например, при использовании этого регулярного выражения Hola como estas — это нормально, но Hola, como estás? не совпадает.

Как я могу настроить его на знаки препинания?


person Jose Aguirre    schedule 28.08.2020    source источник


Ответы (1)


Используйте \W+ вместо пробела и добавьте \W* в конце:

/^[a-zA-Z0-9_]+(?:\W+[a-zA-Z0-9_]+)*\W*$/

См. доказательство.

ОБЪЯСНЕНИЕ

                         EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [a-zA-Z0-9_]+            any character of: 'a' to 'z', 'A' to 'Z',
                           '0' to '9', '_' (1 or more times (matching
                           the most amount possible))
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    \W+                      non-word characters (all but a-z, A-Z, 0-
                             9, _) (1 or more times (matching the
                             most amount possible))
--------------------------------------------------------------------------------
    [a-zA-Z0-9_]+            any character of: 'a' to 'z', 'A' to
                             'Z', '0' to '9', '_' (1 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )*                       end of grouping
--------------------------------------------------------------------------------
  \W*                      non-word characters (all but a-z, A-Z, 0-
                           9, _) (0 or more times (matching the most
                           amount possible))
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
person Ryszard Czech    schedule 28.08.2020
comment
Спасибо за вашу помощь. Но я только что проверил шаблон в угловых валидаторах, и похоже, что он не читает весь шаблон и в конечном итоге выполняет проверку неправильно. Что вы мне посоветуете делать в этом случае? @Рышард - person Jose Aguirre; 28.08.2020
comment
@JoseAguirre Пожалуйста, добавьте код, который вы используете, в вопрос, чтобы увидеть, где он может пойти не так. - person Ryszard Czech; 28.08.2020
comment
@JoseAguirre Убедитесь, что вы не заключаете /^[a-zA-Z0-9_]+(?:\W+[a-zA-Z0-9_]+)*\W*$/ в кавычки. - person Ryszard Czech; 28.08.2020
comment
Спасибо, ошибка была из-за кавычек, так как я добавил шаблон к свойству внутри компонента, чтобы не повторять шаблон снова и снова. Но добавление шаблона непосредственно в Validators.pattern() работает нормально. @Рышард - person Jose Aguirre; 29.08.2020