安卓游戏标签正则验证:如何解决连字符导致的正则拆分问题
解决游戏标签正则验证的问题
你的问题出在正则表达式里的\w上——它其实等价于[a-zA-Z0-9_],不包含连字符(-),所以当标签里的连字符不在开头时,\w+就会在遇到-的时候停止匹配,导致整个验证失败。
修正后的正则表达式
要让所有合规的标签都通过验证,你需要确保整个字符串的每一个字符都属于允许的集合(a-z大小写、0-9、下划线、连字符),同时用锚点^和$限定匹配整个字符串:
正则表达式(通用格式):
^[a-zA-Z0-9_\-]+$
Java中转义后的写法:
String regex = "^[a-zA-Z0-9_\\-]+$";
为什么原正则不行?
原正则[a-zA-Z0-9_\-]\w+的逻辑是:
- 匹配第一个字符,可以是允许的任意字符(包括连字符)
- 然后匹配一个或多个
\w字符(也就是字母、数字、下划线,但不含连字符)
所以当遇到Gamer-Tag时,第一个字符G匹配成功,接着\w+匹配到Gamer就停了(因为下一个字符是-,不在\w范围内),剩下的-Tag没被匹配,整个正则匹配失败;而GamerTag-则是\w+匹配到GamerTag后,末尾的-没被覆盖,同样匹配失败。
验证测试
用修正后的正则测试你的案例:
应通过验证的标签(全部匹配成功):
- GamerTag
- Gamer_Tag
- _GamerTag
- GamerTag_
- -GamerTag
- Gamer-Tag
- GamerTag-
不应通过验证的标签(全部匹配失败):
- !GamerTag
- Gamer%Tag
- Gamer Tag
Java代码示例
这里是一个简单的使用示例,用来验证标签是否合规:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class GamertagValidator { public static void main(String[] args) { String regex = "^[a-zA-Z0-9_\\-]+$"; Pattern pattern = Pattern.compile(regex); // 测试合规标签 String[] validTags = {"GamerTag", "Gamer_Tag", "_GamerTag", "GamerTag_", "-GamerTag", "Gamer-Tag", "GamerTag-"}; for (String tag : validTags) { Matcher matcher = pattern.matcher(tag); System.out.println(tag + ": " + matcher.matches()); // 全部输出true } // 测试不合规标签 String[] invalidTags = {"!GamerTag", "Gamer%Tag", "Gamer Tag"}; for (String tag : invalidTags) { Matcher matcher = pattern.matcher(tag); System.out.println(tag + ": " + matcher.matches()); // 全部输出false } } }
内容的提问来源于stack exchange,提问作者RazzFazz
相关产品推荐
相关产品推荐

