首页 > 解决方案 > 如何避免连字符拆分正则表达式?

问题描述

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

在第一个屏幕中,用户必须输入他的gamertag(作为 a String)。玩家代号应仅包含lettersfroma-z (uppercase and lowercase)和。numbers (0-9)underscores/hpyhens (_ and -)

我可以让它underscore在每个位置或hyphen开始时都与 a 一起工作。但是如果中间String包含 a ,它就会变成 " 分成两部分,如果最后是 a ,它就会独立存在。hyphen"splithyphen

我想出了这个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-

标签: javaandroidregex

解决方案


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

您可以在出现连字符的地方重复字符类 1 次以上,如果连字符位于字符类的末尾,则不必将其删除。

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

Gamer-Tag不会拆分,但有 2 个匹配项。字符类matchesG\w+matches amer。然后在下一个匹配字符类匹配-\w+匹配Tag

如果这些是唯一允许的值,您可以使用锚^来断言字符串的开始和$结束。

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

正则表达式演示


推荐阅读