事先定义好的一些字符的组合,构成“规则字符串”,用来表达对字符串的一种过滤逻辑
语法:[abc]表示匹配a或者b或者c的字符
[^abc]表示匹配不是a或者b或者c的字符
[a-z]在中括号里面的-表示范围,如需匹配短横线,则需在后面再加-,如[0-9-]
. 点匹配除了缩进换行符以外的任何字符
\d 匹配数字
\s匹配任何空白字符
\w匹配包括下划线的任何单词字符和数字
边界:^ $ 为起始边界
量词:? 匹配0个或1个
+ 匹配 >=1 个
* 匹配任意多个
{n,m} n为最少,m为最多
{n},则为精确匹配
{n,},则匹配大于n个
匹配模式:默认的匹配模式是贪婪模式(即尽可能多的匹配)若想将贪婪模式改成“非贪婪模式”,只需在量词后面加上“ ? ”
1、匹配用户名:
a)字母、数字、中横线、下划线组成。
b)长度6到8位
c)必须字母开头
正确数据:
zeng-234
z123_-67
L1234567
^[a-zA-Z][\w-]{6,8}$
2、匹配手机号
a)开头必须是13或15或18
b)长度11位
正确数据:
13566667777
15888887777
^(1[358])\d{9}$
3、匹配电话号码(区号-电话号码)
a)区号以0开头,3到4位
b)区号和电话号码之间有中横线'-'
c)电话号码7-8位
d)区号和-可以省略不写
正确数据:
028-66667777
0817-7776666
85041591
(^0\d{2,3}-?)\d{7,8}$
4、电子邮件地址验证
a)格式:用户@地址;
b)用户:字母数字下划线组成
c)地址:字母和和数字小数点组成
正确数据:
12580@qq.com
9090990@vip.qq.com
7474741@sina.com.cn
yanfen@163.com
madong@gmail.com
^(\w+)[@][a-zA-Z\d/.]+$
5、身份证
a)15或18位身份证
b)第一位是1-9的数字
c)18位的身份证最后一位可以是数字或x或X
正确数据:
123456789012345
123456789012344
123456789012345678
12345678901234567x
12345678901234567X
^[1-9][(\d{14}$)(\d{16}[xX]$)]
package com.cdsxt.day22.regex;
import java.util.regex.Pattern;
public class Test1 {
/*
* 测试正则表达式的验证
*
* 需求:邮箱验证:格式:用户名@运营商.后缀(com|cn|com.cn)
* 1、用户名部分:字母开头,长度为6到18,可以是字母、数字、下划线构成。
* 2、运营商部分:数字字母构成,长度为2到8位
* 3、后缀:com|cn|com.cn
*/
public static void main(String[] args) {
volideEmail("lisi123@sina.com.edu");
}
//验证邮箱地址
public static void volideEmail(String email) {
//使用正则表达式来验证邮箱
//定义正则表达式
String regex = "^[a-zA-Z]\\w{5,17}@[a-zA-Z0-9]{2,8}\\.(com|cn|com\\.cn)$";
//进行验证
boolean r = Pattern.matches(regex, email);
System.out.println("邮箱验证:"+(r?"成功":"失败"));
}
}
package com.cdsxt.day22.regex;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test2 {
/*
* Pattern 类的常用方法:
- matches(String regex, CharSequence input):判断一个字符串是否符合正则表达式的规则
- compile(String regex):接受正则表达式,返回与之对应的Pattern对象
- split(CharSequence input, int limit):第二个形参limit,
- 当limit小于1或者大于最大的分割结果数,没有影响
- 其他情况下,最终的数组长度等于limit,从第一个正则表达式开始分割,限制分割的次数
- matcher(CharSequence input):接受字符串并返回Matcher对象
Matcher类的常用方法:
- find(): 查找有无下一个匹配正则表达式的子序列
- find(int start): 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
- String group():返回由以前匹配操作所匹配的输入子序列。
- String group(int group):返回在以前匹配操作期间由给定组捕获的输入子序列,一个括号为一组。
- groupCount():获取总共捕获的组数
- lookingAt():从字符串开始位置匹配第一个子序列
*/
public static void main(String[] args) {
test2();
}
//测试 Pattern 类的常用方法:
private static void test1() {
//matches(String regex, CharSequence input):判断一个字符串是否符合正则表达式的规则
//验证手机号
String regex1 = "^1[358]\\d{9}$";
//验证
boolean r1 = Pattern.matches(regex1, "13500001111");
System.out.println("验证:"+r1);
//compile(String regex):接受正则表达式,返回与之对应的Pattern对象
Pattern pattern = Pattern.compile(regex1);
//字符串的拆分
String str1 = "薛之谦_上海-男_35岁";
String[] strs = str1.split("[-_]", 3);
System.out.println(Arrays.toString(strs));
//split(CharSequence input, int limit):第二个形参limit,
Pattern p2 = Pattern.compile("[-_]");
//拆分
strs = p2.split(str1);
System.out.println(Arrays.toString(strs));
//matcher(CharSequence input):接受字符串并返回Matcher对象
Matcher matcher = p2.matcher(str1);
}
//测试Matcher类的常用方法:
public static void test2() {
//检索邮箱地址
//定义正则表达式
String regex = "([a-zA-Z]\\w{3,17})@([a-zA-Z0-9]{2,8})\\.(com|cn|com\\.cn)";
//创建正则表达式对象
Pattern pattern = Pattern.compile(regex);
//创建包含邮箱地址的一些字符串数据
String data = "user:zhangsan;age:18;email:zhangsan@sina.com;lisi;age:20;email:lisi@qq.com;user:wangwu;age:22;email:wangwu@163.com;";
//获取matcher对象
Matcher matcher = pattern.matcher(data);
//find(): 查找有无下一个匹配正则表达式的子序列
/*boolean r = matcher.find();
if(r) {
//String group():返回由以前匹配操作所匹配的输入子序列。
String email = matcher.group();
System.out.println(email);
}*/
while(matcher.find()) {
//获取匹配到的内容
String email = matcher.group();
System.out.println(email);
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
}
}