Как избежать дефиса от разбиения регулярного выражения? - PullRequest
3 голосов
/ 09 июня 2019

Я пишу простое приложение для Android для сохранения ваших любимых игр в списке.

На первом экране пользователь должен ввести свой gamertag (как String). Тег игрока должен содержать только letters из a-z (uppercase and lowercase), numbers (0-9) и underscores/hpyhens (_ and -).

Я могу заставить его работать с underscore в каждой позиции или hyphen в начале. Но если String содержит hyphen в середине, он получает "split "на две части, и если hyphen находится в конце, он стоит один.

Я придумал это regex:

[a-zA-Z0-9_\-]\w+

в Java это выглядит немного иначе, потому что \ нужно экранировать:

[a-zA-Z0-9_\\-]\\w+

Gamertags, которые должны подтвердить:

- GamerTag
- Gamer_Tag
- _GamerTag
- GamerTag_
- -GamerTag
- Gamer-Tag
- GamerTag-

Gamertags, которые не должны проверяться:

- !GamerTag
- Gamer%Tag
- Gamer Tag

Gamertags, которое должно быть проверено, но мой regex не проходит:

- Gamer-Tag
- GamerTag-

1 Ответ

6 голосов
/ 09 июня 2019

Ваш шаблон [a-zA-Z0-9_\-]\w+ соответствует 1 символу из класса символов, за которым следует 1+ раз символ слова \w, который не соответствует -.

Вы можете повторить класс символов более 1 раза там, где присутствует дефис, и, если дефис находится в конце класса символов, вам не нужно удалять его.

[a-zA-Z0-9_-]+

Gamer-Tag не разделяется, но имеет 2 совпадения. Класс символов соответствует G, а \w+ соответствует amer. Затем в следующем сопоставлении класс символов соответствует -, а \w+ соответствует Tag.

Если это единственные допустимые значения, вы можете использовать якоря ^ для подтверждения начала и $ для подтверждения конца строки.

^[a-zA-Z0-9_-]+$

Regex demo

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