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

时间:2019-06-09 12:26:23

标签: java android regex

我正在编写一个简单的android应用程序,用于将您喜欢的游戏保存在列表中。

在第一个屏幕中,用户必须输入他的gamertag(作为String)。玩家标签只能包含lettersa-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 个答案:

答案 0 :(得分:6)

您的模式[a-zA-Z0-9_\-]\w+匹配字符类中的1个字符,然后是与\w不匹配的单词字符-的1+倍。

您可以在出现连字符的位置重复字符类1次以上,如果连字符位于字符类的末尾,则不必对其进行替换。

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

Gamer-Tag未拆分,但有2个匹配项。字符类与G相匹配,而\w+amer相匹配。然后在下一个匹配项中,字符类匹配-,而\w+匹配Tag

如果仅允许这些值,则可以使用锚点^来声明字符串的开始,并使用$来声明字符串的结尾。

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

Regex demo