正则表达式
-
定义:正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串
-
作用:用于测试是否匹配指定字符串的,通常用来检索、替换那些符合某个模式的文本。
-
测试字符串的某个模式。
例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证 -
替换文本。
可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字 -
根据模式匹配从字符串中提取一个子字符串。
可以用来在文本或输入字段中查找特定文字
java.util.regex包中提供了以下两个类对正则表达式的支持:
- Matcher类
通过解释Pattern对character sequence执行匹配操作的引擎 - Pattern类
正则表达式的编译表示形式
练习1、判断一个字符串中是否全是数字
/*
*不使用正则
*/
public static void main(String[] args) {
String str = "132a45";
char[] charArray = str.toCharArray();
boolean flag = true;
for (int i = 0; i < charArray.length; i++) {
if(!Character.isDigit(charArray[i])) {
flag = false;
break;
}
}
if(flag) {
System.out.println("该字符串全是数字构成");
}else {
System.out.println("该字符串不全是数字构成");
}
}
}
/*
*使用正则表达式:
*/
public class Test02 {
public static void main(String[] args) {
String str = "18548";
boolean number = isNumber(str);
System.out.println(number);
}
//1、我们需要把字符中类型的正则表达式编译成一个正则模式
private static boolean isNumber(String str) {
Pattern pattern = Pattern.compile("\\d+"); //得到一个正则模式或[0-9]+
//使用正则模式去匹配一个字符串
Matcher matcher = pattern.matcher(str); //向上转型 String-->CharSequence
//3、使用匹配者执行匹配
boolean matches = matcher.matches();
return matches;
}
}
规则一、匹配单个字符
字符:
字符组:
预定义字符:
规则二、匹配多个字符
► 练习一:匹配任意多个字符
► 练习二:判断字符串是否匹配 年-月-日 时:分:秒.毫秒 的形式,比如:1998-02-03 10:21:09.100
► 练习三:一个字符串只能由字母、数字、_ 组成,其长度只能是 6~15 位
► 练习四:验证一个字符串是否是小数
//练习1:匹配多个任意字符
private static void test1() {
Pattern pattern = Pattern.compile(".*");
Matcher matcher = pattern.matcher("aasfasf");
boolean find = matcher.find();
System.out.println(find);
}
//练习二:判断字符串是否匹配 年-月-日 时:分:秒.毫秒 的形式,比如:1998-02-03 10:21:09.100
private static void test2() {
String str = "1998-02-03 10:21:09.100";
//正则
Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d{3}")
Matcher matcher = pattern.matcher(str);
boolean matches = matcher.matches();
System.out.println(matches);
}
//练习三:一个字符串只能由字母、数字、_ 组成,其长度只能是 6~15 位
private static void test3() {
String str = "asdafasffasfa";
System.out.println(str.length());
//正则
Pattern pattern = Pattern.compile("\\w{6,15}");
Matcher matcher = pattern.matcher(str);
boolean matches = matcher.matches();
System.out.println(matches);
}
//练习四:验证一个字符串是否是小数(兼容小数)
private static void test4() {
String str = "3.5";
Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?"); //括号是分组
Matcher matcher = pattern.matcher(str);
boolean matches = matcher.matches();
System.out.println(matches);
}
规则三、量词种类
1、贪婪型量词(默认)(最大匹配)
2、勉强型量词(最小匹配)
3、占有型量词(完全匹配)
量词总结:
► 贪婪型量词被称为 “贪婪的” 是因为匹配器被强制要求第一次尝试匹配时读入整个输入串,如果第一次 尝试匹配失败,则从后往前逐个字符地回退并尝试再次匹配,直到匹配成功或没有字符可回退。
► 勉强型采用与贪婪型相反的方法,它从输入串的首(字符)位置开始,在一次尝试匹配查找中只勉强地读 一个字符,直到尝试完整个字符串。
► 占有型量词总是读入整个输入串,尝试一次(仅且一次)匹配成功,不像贪婪型,占有型从不回退,即便 这样做也可能使整体匹配成功。
规则四、边界匹配
案例1:匹配以dog开头以及以dog结尾的字符串:
正则表达式的练习:
1、验证电话号:
现在要求编写一个正则表达式,已验证电话号是否正确:
51283346 因为电话号可能是由7~8位所组成
01051283346 因为电话号前边可能是有3~4位区号
010-51283346 因为电话号前边可能出现-,也可能不出现
(010)-51283346 因为电话号前边区号可能会用小括号括起来
public class Test01 {
public static void main(String[] args) {
Pattern pattren = Pattern.compile("((\\d{3,4}|(\\d{3,4}))-?)?\\d{7,8}");
Matcher matcher = pattren.matcher("-51283346");
boolean isFound = false;
while(matcher.find()) {
System.out.println("找到的子字符串是:"+matcher.group()+
",开始的下标位置:"+matcher.start()+
",结束的下标位置是:"+matcher.end());
isFound = true;
}
if(isFound) {
System.out.println("匹配成功");
}else {
System.out.println("匹配失败!!");
}
}
}
2、匹配指定字符串:
截取字符串中第一个出现英文括号左括号之前的字符串
比如:北京市(海淀区)(朝阳区)(西城区)
截取结果:北京市
public class Test02 {
public static void main(String[] args) {
Pattern pattren = Pattern.compile(".*?(?=\\()");
Matcher matcher = pattren.matcher("北京市(海淀区)(朝阳区)(西城区)");
boolean isFound = false;
while(matcher.find()) {
System.out.println("找到的子字符串是:"+matcher.group()+
",开始的下标位置:"+matcher.start()+
",结束的下标位置是:"+matcher.end());
isFound = true;
}
if(isFound) {
System.out.println("匹配成功");
}else {
System.out.println("匹配失败!!");
}
}
}
3、验证邮箱:
现在要求编写一个正则表达式,已验证邮箱是否正确:
例:
tangwq_ok@163.com
469267111@qq.com
tangwq_ok@gridsum.cn
angwq_ok@gridsum.net
第一部分:邮箱的第一个字符只能以字母或数字或_开头
第二部分:可以是字母、数字、、.组成 数量不固定
第三部分: @
第四部分:可以是字母、数字、_、.组成 数量至少有一
第五部分:con、 com 、net
public class Test03 {
public static void main(String[] args) {
Pattern pattren = Pattern.compile("\\w[a-zA-Z_0-9\\.]*@[a-zA-Z_0-9\\.]+\\.(com|cn|net)");
Matcher matcher = pattren.matcher("tangwq_ok@gridsum.cn");
boolean isFound = false;
while(matcher.find()) {
System.out.println("找到的子字符串是:"+matcher.group()+
",开始的下标位置:"+matcher.start()+
",结束的下标位置是:"+matcher.end());
isFound = true;
}
if(isFound) {
System.out.println("匹配成功");
}else {
System.out.println("匹配失败!!");
}
}
}