用正则表达式完全匹配帐号名

来源:互联网 发布:唯品会 有类似淘宝客 编辑:程序博客网 时间:2024/05/22 10:02

有时我们用正则表达式来处理一些问题,会起到很好的效果。

这种效果可以运用在验证数据方面,举个简单的例子:我们需要判断所输入的字符是否符合作为一个帐号名的规则。

我们先用一下的代码来验证一下:

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

 

原创粉丝点击