概述
有时我们用正则表达式来处理一些问题,会起到很好的效果。
这种效果可以运用在验证数据方面,举个简单的例子:我们需要判断所输入的字符是否符合作为一个帐号名的规则。
我们先用一下的代码来验证一下:
FileInputStream input =new FileInputStream(args[0]);
Pattern USER_PATTERN = Pattern.compile("[0-9a-zA-Z_]+"); //能包含英文字母、数字和下划线
Matcher matcher = USER_PATTERN.matcher(input );
boolean rs=matcher.find();
经过验证,我们能输入“hero_qx007"之类格式的帐号名。如果你试图输入“#@$a”,竟然也通过验证。
所以上面的方法是存在漏洞的。
出现问题的原因是"[0-9a-zA-Z_]+"只是部分匹配,当它匹配到“a”时,就返回正值:即 rs=true。
我们试图把代码改为:
FileInputStream input =new FileInputStream(args[0]);
int n=input.length
Pattern USER_PATTERN = Pattern.compile("[0-9a-zA-Z_]{n}"); //能包含英文字母、数字和下划线
Matcher matcher = USER_PATTERN.matcher(input );
boolean rs=matcher.find();
会发现代码不能正常运行,我们有理由相信是由于{}之中只接受数字而不接受变量。
现在有一个难题,输入字串为随意的长度,我们不能预先知道它。也就不可能往{}之中添加任何数字了。
那么,我们有什么办法来解决完全匹配的问题呢?答案是:用“^”自动侦测行开始,用“$”自动侦测行结束。代码可以这样写:
FileInputStream input =new FileInputStream(args[0]);
Pattern USER_PATTERN = Pattern.compile("^[0-9a-zA-Z_]+$"); //能包含英文字母、数字和下划线
Matcher matcher = USER_PATTERN.matcher(input );
boolean rs=matcher.find();
重新输入“#@$a”,rs=false
最后
以上就是儒雅酸奶为你收集整理的用正则表达式完全匹配帐号名的全部内容,希望文章能够帮你解决用正则表达式完全匹配帐号名所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复