Regex для проверки последовательного появления символа точки в имени пользователя - PullRequest
2 голосов
/ 05 августа 2010

Мне нужно проверить имя пользователя в моем приложении, чтобы оно не могло содержать два последовательных символа периода. Я попробовал следующее.

 username.match(/(..)/)

но обнаружил, что это соответствует "а". и ".." Я ожидал получить ноль в качестве результата операции сопоставления для ввода «а». Правильный ли мой подход?

Ответы [ 2 ]

8 голосов
/ 05 августа 2010

Вам необходимо поставить \ перед точками, потому что точка является зарезервированным символом для «любого символа, кроме новой строки».

Так что попробуйте:

username.match(/(\.\.)/)
6 голосов
/ 05 августа 2010

Краткий ответ

Вы можете использовать что-то вроде этого ( см. На rubular.com ):

username.match(/\.{2}/)

Символу . предшествует обратная косая черта, {2} - точный спецификатор повторения, и скобки удаляются, так как в этом случае захват не требуется.


О метасимволах и экранировании

Точка как метасимвол шаблона соответствует (почти) любому символу. Чтобы соответствовать буквальному периоду, у вас есть как минимум два варианта:

  • Избегайте точки как \.
  • Сопоставить его синглтоном класса персонажа [.]

Другие метасимволы, которые могут нуждаться в экранировании: | (чередование), + / * / ? / { / } (повторение), [ / ] (класс символов ) ^ / $ (якоря), ( / ) (группировка) и, конечно, \.

Ссылки


О конечном повторении

Чтобы соответствовать двум буквальным периодам, вы можете использовать, например, \.\. или [.][.], то есть простая конкатенация. Вы также можете использовать конструкцию повторения, например, \.{2} или [.]{2}.

Спецификатор конечного повторения также позволяет вам написать что-то вроде x{3,5}, чтобы соответствовать как минимум 3, но не более 5 x.

Обратите внимание, что повторение имеет более высокий приоритет, чем конкатенация, поэтому ha{3} не соответствует "hahaha"; соответствует "haaa" вместо . Вы можете использовать группировку, например (ha){3}, чтобы соответствовать "hahaha".


О группировке

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

Если вам не нужны эти функции, тогда опция не захвата - (?:…). Таким образом, что-то вроде (?:ha){3} по-прежнему соответствует "hahaha", как и раньше, но без создания группы захвата.

Если вам на самом деле не нужен аспект группировки, тогда вы можете просто полностью исключить скобки.

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