针对文本文件进行某个规则的校验,只能校验文本格式,不能对内容进行验证
意义:
1、普通字符:没有特殊含义的标点符号、数字、字母、下划线
2、转义字符:换行\n、制表符\t、回车\r、以及有特殊符号的标点符号前面加上\
3、标准字符集合:匹配所有数字\d、(\D取反)
匹配所有数字字母下划线\w、(\W取反)
匹配空格字符回车换行制表符\s、(\S取反)
匹配除了换行以外的所有字符.
4、自定义字符集: 用 [ ] 定义需要匹配的集合,除了匹配^需要加\外,其余的符号写在[ ]里面都是表示匹配符号本身,比如,
[0-5a-f] 表示匹配0-5的数字和a-f的字符
[^0-5a-f] 表示匹配除了0-5和a-f以外的内容
{m} 表示[ ]里面的内容需要匹配m次
{m,n} 表示[ ]里面的内容至少需要匹配m次,最多只能匹配n次
{m,} 表示[ ]里面的内容最少要匹配m次,没有最多次数限制
? 表示匹配0次或者1次(等价于{0,1})
+ 表示匹配最少1次 (等价于{1,})
* 表示匹配0次或者任意次 (等价于{0,})
注意:定义量词时我们一般常用贪婪模式,即匹配的字符越多越好;而非贪婪模式就是匹配最少次数,在量词后面加?即可实现。默认采用贪婪模式
6、字符边界(也称零宽)
\b 匹配的是单词结尾
\B 匹配的是除了结尾的全部
^ 放在开头,表示匹配以某内容开始的字符串
$ 放在末尾,表示匹配以某内容结尾的字符串
7、选择符和分组
| 表示或
( ) 用括号起来的部分就是分了组
注:分组有捕获式分组和非捕获式分组,其中捕获式分组会缓存捕获的内容,用“\编号”的方式获得捕获内容,放在表达式之后;非捕获式分组不会缓存内容,用“?:”的方式选择非捕获式分组,放在表达式之前。一般推荐使用费捕获式分组,这样不会占用内存
8、预搜索
(?=pattern) 正向肯定预查 断言自身出现的位置后面能跟哪些元素
例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。
(?!pattern) 正向否定预查 断言自身出现的位置后不能跟哪些元素
例如:"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。
(?<=pattern) 反向肯定预查 与正向肯定预查类拟,只是方向相反。
例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
(?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。
例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
实例
匹配一个IP地址:
(((?:[1-9]\d?)|(?:1[0-9]2)|(?:2[0-4][0-9])|(?:25[0-5]))[.]){3}((?:[1-9]\d?)|(?:1[0-9]2)|(?:2[0-4][0-9])|(?:25[0-5]))
匹配密码是否符合格式:(必须同时包含数字、大小写字母、标点符号)
(?=^.{6,8}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W+)(?!.*[^\d\Wa-zA-Z])
匹配年月日:
(\d{2}|\d{4})-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12][0-9])|(3[01]))
匹配时间:
(((0?|1)[0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])
匹配座机号码:
^0\d{2}-[1-9]\d{7}|^0\d{3}-[1-9]\d{6}
eclipse操作:
private static void idcard() {
System.out.println("请输入四川省的身份证:");
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
String regex = "^51\\d{4}\\d{4}(?:0\\d|1[0-2])(?:0[1-9]|1\\d|2\\d|3[0-1])\\d{3}[0-9xX]";
//判断用户的输入 是否满足身份证规则
Pattern pattern = Pattern.compile(regex);//定义正则表达式的模板
Matcher matcher = pattern.matcher(str);//将用户的输入与模板进行对比
if(matcher.matches()) {
System.out.println("√");
return;
}else {
System.out.println("身份证格式不正确,请重新输入:");
idcard(); // 输入不正确重新输入
}