一、概述
概念:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
简述:符合某个规则的字符串。
二、组成规则
1.字符
x 代表一个字符,可以是字母、数字等
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
//如下正则表达式,匹配一段字符串中是否有新行、回车符、TESTNAME字符、\d,\\d表示\d
string regEx = "\n\\d*\r*!\\s*TESTNAME“
2.字符类
[abc] a、b 或 c,例如"[abc]"可以匹配"plain"中的'a'
[ ^abc] 任何字符,除了 a、b 或 c,例如"[ ^abc]"可以匹配"plain"中的'p'、'l'、'i'、'n'。
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内,例如"[a-z]"可以匹配'a'到'z'范围内的任意小写字母
[0-9] 0到9的字符都包括,例如"[0-9]"可以匹配'0'到'9'范围内的任意数字
3.预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.,例如"^.$"可以匹配所有字符
\d 数字:[0-9],例如"\\d"可以匹配0-9的所有数字,第一个\是转义符
\w 单词字符:[a-zA-Z_0-9],例如"\w"可以匹配a到z,A到Z,_,0到9这些字符
在正则表达式里面组成单词的东西必须有这些东西组成
4.边界匹配器
^ 行的开头 ,例如"^1[abc]$"可以匹配"1a"中的1,不能匹配"a1"中的1
$ 行的结尾 ,例如"^1[abc]$"中$表示正则表达式的结尾
\b 单词边界(需使用模式和匹配器),就是不是单词字符的地方,例如"er\b"可以匹配"never"中的"er",但不能匹配"verb"中的"er"
5.数量词
X? X,一次或一次也没有,例如"do(es)?" 可以匹配 "do" 或 "does" 中的"do"
X* X,零次或多次,例如"zo*" 能匹配"z"以及"zoo"
X+ X,一次或多次,例如"zo+"能匹配"zo"以及"zoo"但不能匹配"z"
X{n} X,恰好n次,例如"o{2}"不能匹配"Bob"中的"o"但是能匹配"food"中的两个o
X{n,} X,至少n次,例如"o{2,}"不能匹配"Bob"中的"o"但能匹配"foooood"中的所有 o
X{n,m} X,至少n次但是不超过m次,例如"o{2,3}"能匹配"foood"中的三个o,但不能匹配"fod"中的一个o
三、 正则表达式常用方法
正则表达式使用String类中提供的方法进行判断操作。
1.判断功能
//matches是匹配功能
public boolean matches(String regex)
//案例
public static void main(String[] args) {
//1.正则表达式,匹配:public boolean matches(String regex)
System.out.println("abc".matches("[a-z]{4}"));
}
2.分割功能
//split是分割功能
public String[] split(String regex)
//案例
public static void main(String[] args) {
String str = "abc,123,Aaa,DDD";//获得字符串
String[] arr = str.split(",");//分割字符串
for(int i = 0;i<=arr.length - 1;i++){//循环遍历得到每一个字符串
System.out.println(arr[i]);
}
}
3.获取功能
java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现。
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
public static void main(String[] args) {
/*获取字符串中符合条件的内容
条件:
1 获取字符串中所有三个连续的字母,并打印
\b 单词边界(需使用模式和匹配器),就是不是单词字符的地方,例如"er\b"可以匹配"never"中的"er",但不能匹配"verb"中的"er
*/
//定义字符串
String content = "jin tian hen gao xing,yin wei tong zhi bu shang wan zi xi";
// 制定的匹配规则,编写正则
String regex = "\\b\\w{3}\\b";
// 将给定的正则表达式编译到具有给定标志的模式中。
Pattern compile = Pattern.compile(regex);
// 创建匹配给定输入与此模式的匹配器
Matcher matcher = compile.matcher(content);
//尝试查找与该模式匹配的输入序列的是否有下一个子序列。
while(matcher.find()){
//如果有,就获取这个符合条件的子序列
String group = matcher.group();
//输出找到的结果
System.out.println(group);
}
4.判断功能
使用Pattern和Matcher对字符串进行判断,作用和String的matchers()方法一样,用String的更加简便
public static void main(String[] args) {
//第一个\表示转义符,\d表示任何数字,+表示出现一次或多次,整体表示任意数字出现一次或多次
Pattern p=Pattern.compile("\\d+");
//对字符串 22bb23 进行匹配
Matcher m1=p.matcher("2223");
//获取匹配的结果
boolean rs1 = m1.matches();
System.out.println("2223匹配的结果:"+rs1);
Matcher m2=p.matcher("22dd23");
//获取匹配的结果
boolean rs2 = m2.matches();
System.out.println("22dd23匹配的结果:"+rs2);
}
5.替换功能
//replaceAll是替换功能
public String replaceAll(String regex,String replacement)
//案例
public static void main(String[] args) {
//把dasdDADdaas中所有的大写字母A-Z改为M
System.out.println("dasdDADdaas".replaceAll("[A-Z]", "M"));
}
四、 正则表达式的应用
1.验证手机号
private static void phoneNum() {
//说明:前三位分别以13,14,15,18开头,第3位使用部分数组,总长度是11位
//正则表达式
String regex = "(13[0-9]|14[5|7]|15[0|1|5|6]|18[2|5])\\d{8}";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入手机号:");
String num = scanner.nextLine();
System.out.println("是否是一个手机号:" + num.matches(regex));
}
2.验证邮箱
/**
* 546513287@qq.com
* anfly@163.com
* anfly@126.com
* aslklsdj@sina.com.cn
*/
private static void email() {
//scanner
Scanner scanner = new Scanner(System.in);
System.out.println("请输入邮箱:");
String s = scanner.nextLine();
//定义一个邮箱正则表达式[]
String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-z]{2,3})+";
System.out.println("是否是一个邮箱:" + s.matches(regex));
}