在做登录、注册、用户资料修改等功能,经常需要做字符串验证,常规需求如下:
- 姓名:2到10位字符,不包含数字和特殊字符(``~!@#$%^&*()-=_+[]{};':"",./<>?"` )
- 手机号码:以1开头的11位数字
- 身份证号码:18位的,且前17位为数字,最后一位为数字或者大写X
- 邮箱:
- 必须包含一个并且只有一个符号“@”
- 第一个字符不得是“@”或者“.”
- 不允许出现“@.”或者.@
- 结尾不得是字符“@”或者“.”
- 允许“@”前的字符中出现“+”
- 验证码:4到6位数字或字母
- 年龄:[0,200]的整数或小数(小数点后1位)
- 身高:2到3位整数或小数(小数点后1位)
- 体重:1到3位整数或小数(小数点后1位)
这些需求中,最后三个可以用整型或浮点型来处理,前面五个都是字符串匹配,怎么满足这些林林总总的需求,一个好用的工具是正则表达式。
一、概念
其百度百科上定义如下:
正则表达式,又称正规表示法、常规表示法。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
其实 正则表达式 就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 匹配字符串:给定的字符串是否符合正则表达式的过滤逻辑;
- 提取字符串:可以通过正则表达式,从字符串中获取我们想要的特定部分。
基本上所有主流的高级语言(如 C++、java)、编辑器(notepad++、atom、EditPlus、Word)都支持正则表达式的解析。
二、核心语法
正则表达式由一些 普通字符 和一些 元字符(metacharacters)组成。
A. 元字符:又称特殊字符,主要用来标识字符串匹配的位置、内容
- 位置标识字符
- ^:匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
- $:匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
- \b:匹配一个字边界,即字与空格间的位置。
- \B:非字边界匹配。
- ( ):标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
- []:标记一个 中括号表达式 的。里面内容为候选项。
- {}:标记 限定符表达式 。
- 内容标识字符:
- .:匹配除换行符
\n
之外的任何单字符。 - \d:匹配0-9。
- 内容重复状态标识字符
- *:匹配前面的子表达式零次或多次。
- +:匹配前面的子表达式一次或多次。
- ?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
- |:指明两项之间的一个选择。
- {n,m}:其中n <= m。最少匹配 n 次且最多匹配 m 次。通用变体为{n}、{n,}
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
- 转义字符:
- \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。
B. 普通字符
除了元字符外的其他字符都是普通字符,包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号(如换行\n
、换页\p
、制表符\t
等)。
三、JAVA实现
package lib;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by shitianci on 16/7/8.
*/
public class TextUtil {
/**
* 姓名:2到10位字符,不包含数字和特殊字符(`~!@#$%^&*()-=_+[]{};':"",./<>?")
* 正则表达式为 ^[^~!@#\$%\^&\*\(\)\-=_\+\[\]\{\};':"",./<>\?]{2,100}$
*/
public static boolean isName(String string) {
String regex = "^[^`~!@#\\$%\\^&\\*\\(\\)\\-=_\\+\\[\\]\\{\\};':\",./<>\\?]{2,10}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
return m.matches();
}
/**
* 手机号码:以1开头的11位数字
* 正则表达式为:^(1)\d{10}$
*/
public static boolean isPhone(String string) {
String regex = "^(1)\\d{10}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
return m.matches();
}
/**
* 身份证号码:18位的,且前17位为数字,最后一位为数字或者大写X
* 正则表达式为:^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
*/
public static boolean isIdentification(String string) {
String regex = "^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
return m.matches();
}
/**
* 邮箱
* 1. 必须包含一个并且只有一个符号“@”
* 2. 第一个字符不得是“@”或者“.”
* 3. 不允许出现“@.”或者.@
* 4. 结尾不得是字符“@”或者“.”
* 5. 允许“@”前的字符中出现“+”
* 正则表达式为:^[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?$
*/
public static boolean isEmail(String string) {
String regex = "^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
return m.matches();
}
/**
* 验证码:4到6位数字或字母
* 正则表达式为:^[\da-zA-Z]{4,6}$
*/
public static boolean isVerificationCode(String string) {
String regex = "^[\\da-zA-Z]{4,6}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(string);
return m.matches();
}
}
参考:
Panda
2016-07-08
网友评论