正则表达式
1.正则表达式
正则表达式的英文名称是Regular Expression,是一个字符串,由普通的字符(如字符a~z)以及特殊字符(元字符)组成,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个语法规则的字符串。在实际开发中,常用来检索、替换那些符合某个规则的文本。
2.正则表达式的匹配规则
正则表达式的语法规则:
(1)字符
字符:x
含义:代表的是字符x
例子:匹配规则为“a”,匹配内容为"a"
字符:\\
含义:反斜线字符'\'
例子:匹配字符为"\\|,匹配字符内容为"\"
字符:\t
含义:制表符
例子:匹配规则为"\t",相当于Tab键,产生一个制表符空间
字符:\n
含义:换行符
例子:匹配规则为"\n",效果为就是换行,光标在原位置的下一行
字符:\t
含义:回车符
例子:匹配规则为"\t",效果为回车效果,光标来到下一行
(2)字符类
字符类:[abc]
含义:代表字符a、b或c
例子:匹配规则为"[abc]",匹配的内容为字符a,或者字符b,或者字符c
字符类:[^abc]
含义:代表除了字符a、b或c意外的任意字符
例子:匹配规则为"[^abc]",匹配的内容为除了字符a,或者字符b,或者字符c的任意一个字符
字符类:[a-zA-Z]
含义:代表a到z或A-Z,两头的字母包含在内
例子:匹配规则为"[a-zA-Z]",匹配一个大写或小写字母
字符类:[0-9]
含义:代表数字0到9,两头的数字包含在内
例子:匹配规则为"[0-9]",匹配的内容一个数字
字符类:[a-zA-Z_0-9]
含义:代表字符a、b或c
例子:匹配规则为"[a-zA-Z_0-9]",匹配的内容为一个数字或者一个字母或者一个下划线
(3)预定义字符类
预定义字符类:.
含义:代表的任何字符
例子:匹配规则为:".",匹配的是一个任意字符。使用.需要使用匹配规则"\\."来实现
预定义字符类:\d
含义:代表0到9的数,两端包含在内,相当于[0-9]
例子:匹配规则为:"\d",匹配的是一个数字
预定义字符类:\w
含义:代表字母或者数字或者下划线(即单字符),相当于[a-zA-Z_0-9]
例子:匹配规则为:"\w",匹配的内容为一个数字或者一个字母或者一个下划线
(4)边界匹配器
边界匹配器:^
含义:代表行的开头
例子:匹配规则为^[abc][0-9]$,匹配的内容从[abc]这个位置开始,相当于左双引号
边界匹配器:$
含义:代表行的结尾
例子:匹配规则为^[abc][0-9]$,匹配的内容以[0-9]结尾,相当于右双引号
边界匹配器:\b
含义:代表单词的边界
例子:匹配规则为\b[abc]\b,代表字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])
边界匹配器:X?
含义:代表X出现一次或者一次也没有
例子:匹配规则为"a?",匹配的内容是一个字符a,或者一个a也没有
边界匹配器:X*
含义:代表行的开头
例子:匹配规则为"X*",匹配的内容是多个字符a,或者一个a也没有
(5)数量词
数量词:X+
含义:X出现一次或者多次
例子:匹配规则为"a+",匹配的内容是多个字符a,或者一个a
量词:X{n}
含义:X恰好出现n次
例子:匹配规则为"a{5}",匹配的内容是5个字符a
量词:X{n,}
含义:X至少出现n次
例子:匹配规则为"a{5,}",匹配的内容是最少有5个字符a
量词:X{n,m}
含义:X至少出现n次,但不超过m次
例子:匹配规则为"a{5,8}",匹配的内容是最少有5个字符a,但是不超过8个
3.字符串类型中与正则表达式相关的三种方法
(1)matches(String regex)
这个函数的作用是告诉这个字符串是匹配给特定的字符串的正则表达式
例子:检查QQ号是否正确
package demo;
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
String regex = "[1-9][0-9]{4,14}";
System.out.println("请输入QQ号");
Scanner input = new Scanner(System.in);
String qq = input.next();
boolean flag = qq.matches(regex);
System.out.println(flag);
}
}
String regex = “[1-9][0-9]{4,14}”;此条语句表示QQ号是以1-9开头,其余为可以是0-9的任意一位数字,QQ号最长为14位,最短是4位数字。
(2)split(String regex)
此函数的作用是根据正则表达式的匹配拆分此字符串
例子:
package demo;
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
String regex = "[,。]";
System.out.println("请输入要分割的字符串:");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
String ss[] = s.split(regex);
for(String s1:ss) {
System.out.println(s1);
}
}
}
运行结果:从中我们可以看到,我们输入的字符串被以“,。”为界限分隔开来,由于分隔后字符串变成了一个数组,所以我们需要用一个数组去接收它
(3)replaceAll(String regex,String replacement)
使用指定的replacement字符串替换所有匹配的正则表达式的子字符串
package demo;
import java.util.Scanner;
public class RegexDemo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = input.nextLine();
str = str.replaceAll("[\\d+]", "#");
System.out.println(str);
}
}
运行结果: