如何避免连字符将正则表达式分割?

3
我正在编写一个简单的Android应用程序,用于将您喜爱的游戏保存到列表中。
在第一个屏幕上,用户必须输入他的“gamertag”(作为一个字符串)。gamertag 只能包含来自a-z(大写和小写)、数字(0-9)和下划线/连字符(_和-)的字母。
我可以让它在每个位置都带有下划线或以连字符开头。但是,如果字符串中包含一个连字符,则会被“分割”成两个部分,如果连字符位于末尾,则会独立存在。
我提出了这个正则表达式:
[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

应该符合规则的游戏标签,但我的正则表达式无法匹配:

- Gamer-Tag
- GamerTag-
1个回答

10

您的模式[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_-]+$

正则表达式演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接