java - 如何避免连字符拆分正则表达式?
问题描述
我正在编写一个简单的 android 应用程序,用于将您喜欢的游戏保存在列表中。
在第一个屏幕中,用户必须输入他的gamertag
(作为 a String
)。玩家代号应仅包含letters
froma-z (uppercase and lowercase)
和。numbers (0-9)
underscores/hpyhens (_ and -)
我可以让它underscore
在每个位置或hyphen
开始时都与 a 一起工作。但是如果中间String
包含 a ,它就会变成 " 分成两部分,如果最后是 a ,它就会独立存在。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-
解决方案
您的模式[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_-]+$
推荐阅读
- linux - 我可以使用其他发行版的内核升级我的内核吗?
- antlr - 不能只用一个字母创建变量
- c# - 我如何为通过在剃刀组件中的 li 标签中的遍历列表填充的 inputext 放置单独的数据绑定
- c# - C# 高性能方法调用者属性用法
- java - 如何处理使用泛型实现接口的这种情况?
- java - 在Java中反转数组中的每个数字的问题
- laravel - 如何在 Laravel 中为每隔一个星期三设置一个事件
- teamcity - 团队城市 API。如果构建已经在进行中,则不要运行新构建
- python-2.7 - 名称错误:未定义全局名称“BaseFunction”
- android - Android Layout Incompatible Type FrameLayout inside DrawerLayout Widget