文章目录
正则表达式相关知识总结记录(日常开发)
- 首先,直接给出日常开发最常用的一些正则表达式的判断!
常用正则表达式
可以在idea中下载any-rule插件进行快捷使用
//第一部分:1 表示手机号码只能以1开头
//第二部分:[3-9] 表示手机号码第二位只能是3-9之间的
//第三部分:\\d{9} 表示任意数字可以出现9次,也只能出现9次
* 手机号码:1[3-9]\\d{9}
//一:区号@\\d{2,3}0:表示区号一定是以0开头的; \\d{2,3}:表示区号从第二位开始可以是任意的数字,可以出现2到3次。
//二:- ?表示次数,日次或一次
//三:号码 号码的第一位也不能以日开头,从第二位开始可以是任意的数字,号码的总长度:5-10位
* 座机号码:0\\d{2,3}-?[1-9]\\d{4,9}
//邮箱号码
//3232323@qq.com zhangsan@itcast.cnn dlei0009@163.com dlei0009@pci.com.cn
//思路:在书写邮箱号码正则的时候需要把正确的数据分为三部分
//第一部分:@的左边 \\w+ 任意的字母数字下划线,至少出现一次就可以了
//第二部分:@ 只能出现一次
//第三部分:
// 3.1 .的左边[\\w&&[^_]]{2,6} 任意的字母加数字,总共出现2-6次(此时不能出现下划线)
// 3.2 . \\. 点符号需要\\进行转义输出
// 3.3 大写字母,小写字母都可以,只能出现2-3次[a-zA-Z]{2,3}
// (\\.[a-zA-Z]{2,3}){1,2} ()代表分组,我们可以把3.2和3.3看成一组,这一组可以出现1次或者两次
* 邮箱号码:\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}
* 24小时:([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d
([01]\\d|2[0-3])(:[0-5]\\d){2}
* 用户名: \\w{4,16}
* 身份证号码,简单校验:
[1-9]\\d{16}(\\d|X|x)
[1-9]\\d{16}[\\dXx]
[1-9]\\d{16}(\\d(?i)X)
* 身份证号码,严格校验:
[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9|[12])\\d|3[01])\\d{3}[\\dXx]
正则表达式
- 写在前面,正则表达式是通过字符规则+数量词来规定字符串要求格式的一种规范。字符规则部分只针对单个字符:
- 若字符串长度与正则表达式规定字符规则+数量词的长度不同,则直接判断不合规则。
- 若正则表达式没有规定数量词,则默认一个字符规则对应一个字符。
1.1正则表达式-数量词
-
语法示例:
前面的X代表一个字符,后面跟着的符号代表出现次数的规则
- X? : 0次或1次
- X* : 0次到多次
- X+ : 1次或多次
- X{n} : 恰好n次
- X{n,} : 至少n次
- X{n,m}: n到m次(n和m都是包含的)
-
代码示例:
public class Demo { public static void main(String[] args) { // 必须是数字 字母 下划线 至少 6位 System.out.println("2442fsfsf".matches("\\w{6,}"));//true System.out.println("244f".matches("\\w{6,}"));//false // 必须是数字 字母 下划线 至少 6位,最多9位 System.out.println("2442fsfsf".matches("\\w{6,9}"));//true // 必须是数字和字符 必须是4位 System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false // 字符0次到多次 System.out.println("33".matches("\\d?"));//false,0次到1次,所以字符长度不符 System.out.println("33".matches("\\d+"));//true,1次到多次,两个33都得到判断 System.out.println("33a".matches("\\w+"));//true System.out.println("_33a".matches("\\w*"));//true System.out.println("你您".matches("\\W*"));//true } }
1.2 正则表达式-字符类
- 语法示例:
- [abc]:代表a或者b,或者c字符中的==一个==。
- [^abc]:代表除a,b,c以外的任何字符。
- [a-z]:代表a-z的所有小写字符中的一个。
- [A-Z]:代表A-Z的所有大写字符中的一个。
- [0-9]:代表0-9之间的某一个数字字符。
- [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
- [a-dm-p] --[a-d[m-p]]:a 到 d 或 m 到 p之间的任意一个字符(两种写法)。
- [a-z&&[def]]: a到z和def的交集 —>允许范围:d,e,f
- [a-z && [^bc]] — [ad-z]: a到z和非bc的交集(两种写法).
- [a-z&&[^m-p]] ----[a-lq-z ]: a到z和除了m到p的交集。
- [abc]zz: 代表第一个字符为a,b,c中的一个,==后两个字符必须为zz ==
- (\\w[a-zA-Z]{2,3}){1,2} 😦)里表示分组,将两部分作为一组,这一组字符可能出现1到2次
- 代码示例:
package com.itheima.a08regexdemo;
public class RegexDemo2 {
public static void main(String[] args) {
//public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true
// 只能是a b c
System.out.println("-----------1-------------");
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false
System.out.println("aa".matches("[abc]")); // false,因为字符串长度为2,正则为1
// 不能出现a b c
System.out.println("-----------2-------------");
System.out.println("a".matches("[^abc]")); // false
System.out.println("z".matches("[^abc]")); // true
System.out.println("zz".matches("[^abc]")); //false,因为字符串长度为2,正则为1
System.out.println("zz".matches("[^abc][^abc]")); //true
// a到zA到Z(包括头尾的范围)
System.out.println("-----------3-------------");
System.out.println("a".matches("[a-zA-z]")); // true
System.out.println("z".matches("[a-zA-z]")); // true
System.out.println("aa".matches("[a-zA-z]"));//false
System.out.println("zz".matches("[a-zA-Z]")); //false
System.out.println("zz".matches("[a-zA-Z][a-zA-Z]")); //true
System.out.println("0".matches("[a-zA-Z]"));//false
System.out.println("0".matches("[a-zA-Z0-9]"));//true
// [a-d[m-p]] a到d,或m到p
System.out.println("-----------4-------------");
System.out.println("a".matches("[a-d[m-p]]"));//true
System.out.println("d".matches("[a-d[m-p]]")); //true
System.out.println("m".matches("[a-d[m-p]]")); //true
System.out.println("p".matches("[a-d[m-p]]")); //true
System.out.println("e".matches("[a-d[m-p]]")); //false
System.out.println("0".matches("[a-d[m-p]]")); //false
// [a-z&&[def]] a-z和def的交集。为:d,e,f,这种形式规则,看小规则集范围即可
System.out.println("----------5------------");
System.out.println("a".matches("[a-z&[def]]")); //false
System.out.println("d".matches("[a-z&&[def]]")); //true
System.out.println("0".matches("[a-z&&[def]]")); //false
// [a-z&&[^bc]] a-z和非bc的交集。(等同于[ad-z])
System.out.println("-----------6------------_");
System.out.println("a".matches("[a-z&&[^bc]]"));//true
System.out.println("b".matches("[a-z&&[^bc]]")); //false
System.out.println("0".matches("[a-z&&[^bc]]")); //false
// [a-z&&[^m-p]] a到z和除了m到p的交集。(等同于[a-1q-z])
System.out.println("-----------7-------------");
System.out.println("a".matches("[a-z&&[^m-p]]")); //true
System.out.println("m".matches("[a-z&&[^m-p]]")); //false
System.out.println("0".matches("[a-z&&[^m-p]]")); //false
}
}
1.3 正则表达式-逻辑运算符
- 语法示例:
- &&:并且
- | :或者
- \ :转义字符
- 代码示例:
public class Demo {
public static void main(String[] args) {
String str = "had";
//1.要求字符串是小写辅音字符开头,后跟ad
String regex = "[a-z&&[^aeiou]]ad";
System.out.println("1." + str.matches(regex));
//2.要求字符串是aeiou中的某个字符开头,后跟ad
regex = "[a|e|i|o|u]ad";//这种写法相当于:regex = "[aeiou]ad";
System.out.println("2." + str.matches(regex));
//3.此时\表示转义字符,改变了后面那个双引号原本的含义
//把他变成了一个普普通通的双引号而已。
System.out.println("\"");
// \表示转义字符
//两个\的理解方式:前面的\是一个转义字符,改变了后面\原本的含义,把他变成一个普普通通的\而已。
System.out.println("c:Users\\moon\\IdeaProjects\\basic-code\\myapi\\src\\com\\itheima\\a08regexdemo\\RegexDemo1.java");
}
}
1.4 正则表达式-预定义字符
- 语法示例:
- “.” : 匹配任何字符。注意:一个点匹配一个字符
- “\d”:任何数字[0-9]的简写;
- “\D”:任何非数字[^0-9]的简写;
- “\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
- “\S”: 非空白字符:[^\s] 的简写
- “\w”:单词字符:[a-zA-Z_0-9]的简写,a到z,A到Z,下划线,0到9之间的一个字符。
- “\W”:非单词字符:[^\w]的简写,是6中单词字符的取反
- 代码示例:
public class Demo {
public static void main(String[] args) {
//.表示任意一个字符
System.out.println("你".matches("..")); //false,因为字符串长度为1,正则为2,长度不符。
System.out.println("你".matches(".")); //true
System.out.println("你a".matches(".."));//true
// \\d 表示任意的一个数字
// \\d只能是任意的一位数字
// 简单来记:两个\表示一个\
System.out.println("a".matches("\\d")); // false
System.out.println("3".matches("\\d")); // true
System.out.println("333".matches("\\d")); // false,因为字符串长度为1,正则为3,长度不符。
//\\w只能是一位单词字符[a-zA-Z_0-9]
System.out.println("z".matches("\\w")); // true
System.out.println("2".matches("\\w")); // true
System.out.println("21".matches("\\w")); // false
System.out.println("你".matches("\\w"));//false
// 非单词字符
System.out.println("你".matches("\\W")); // true
System.out.println("---------------------------------------------");
// 以上正则匹配只能校验单个字符。
// 下面正则匹配校验多个字符。
// 必须是数字 字母 下划线 至少 6位
System.out.println("2442fsfsf".matches("\\w{6,}"));//true
System.out.println("244f".matches("\\w{6,}"));//false
// 必须是数字和字符 必须是4位
System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));//true
System.out.println("23 F".matches("[a-zA-Z0-9]{4}"));//false
System.out.println("23dF".matches("[\\w&&[^_]]{4}"));//true
System.out.println("23_F".matches("[\\w&&[^_]]{4}"));//false
}
}
1.5 忽略大小写的写法
- (?i) :表示忽略后面数据的大小写
//(?i) :表示忽略后面数据的大小写
//忽略abc的大小写
String regex = "(?i)abc";
//a需要一模一样,忽略bc的大小写
String regex = "a(?i)bc";
//只忽略特定字符b的大小写
String regex = "a((?i)b)c";
1.6 贪婪爬取和非贪婪爬取
只写+和表示贪婪匹配,如果在+和后面加问号表示非贪婪爬取
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据
举例:
如果获取数据:ab+
贪婪爬取获取结果:abbbbbbbbbbbb
非贪婪爬取获取结果:ab
代码示例:
public class RegexDemo10 {
public static void main(String[] args) {
/*
只写+和*表示贪婪匹配
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据
ab+:
贪婪爬取:abbbbbbbbbbbb
非贪婪爬取:ab
*/
String s = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa" +
"经历了很多版木,目前企业中用的最多的是]ava8和]ava11,因为这两个是长期支持版木。" +
"下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
String regex = "ab+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group());
}
}
}
1.7 String的split方法中使用正则表达式
-
String类的split()方法原型:
public String[] split(String regex) //参数regex表示正则表达式。可以将当前字符串中匹配regex正则表达式的符号作为"分隔符"来切割字符串。
-
代码示例:
/* 有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠 要求1:把字符串中三个姓名之间的字母替换为vs 要求2:把字符串中的三个姓名切割出来*/ String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠"; //细节: //方法在底层跟之前一样也会创建文本解析器的对象 //然后从头开始去读取字符串中的内容,只要有满足的,那么就切割。 String[] arr = s.split("[\\w&&[^_]]+");//[小诗诗,小丹丹,小惠惠] for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
1.8 String类的replaceAll方法中使用正则表达式
-
String类的replaceAll()方法原型:
public String replaceAll(String regex,String newStr):
通俗的讲,就是从开始遍历字符串,把符合正则表达式的部分字符,替换成newStr部分指定的字符,生成一个新的字符串
public String replaceAll(String regex,String newStr)
//参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。
//通俗的讲,就是从开始遍历字符串,把符合正则表达式的部分字符,替换成newStr部分指定的字符,生成一个新的字符串
- 代码示例:
/*
有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠
要求1:把字符串中三个姓名之间的字母替换为vs
要求2:把字符串中的三个姓名切割出来*/
String s = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";
//细节:
//方法在底层跟之前一样也会创建文本解析器的对象
//然后从头开始去读取字符串中的内容,只要有满足的,那么就用第一个参数去替换。
String result1 = s.replaceAll("[\\w&&[^_]]+", "vs");
//字符串中dqwefqwfqwfwq12312部分字符满足上面"[\\w&&[^_]]+"正则表达式,则把这部分替换成后面指定的“vs”字符,生成新的字符串---“小诗诗vs12312小丹丹vs小惠惠”。
System.out.println(result1);//小诗诗vs12312小丹丹vs小惠惠
1.9 正则表达式-分组括号( )
细节:如何识别组号?
只看左括号,不看有括号,按照左括号的顺序,从左往右,依次为第一组,第二组,第三组等等
//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
//举例: a123a b456b 17891 &abc& a123b(false)
// \\1---\\组号:表示把第X组的内容再出来用一次
String regex1 = "(.).+\\1";
System.out.println("a123a".matches(regex1));
System.out.println("b456b".matches(regex1));
System.out.println("a123b".matches(regex1));
System.out.println("--------------------------");
//需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
//举例: abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2));
System.out.println("abc123abd".matches(regex2));
System.out.println("---------------------");
//需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
//举例: aaa123aaa bbb456bbb 111789111 &&abc&&
// (.):把首字母看做一组
// \\2:把首字母拿出来再次使用
// *:作用于\\2,表示后面重复的内容出现零次或多次
String regex3 = "((.)\\2*).+\\1";
System.out.println("aaa123aaa".matches(regex3));
System.out.println("&&abc&&".matches(regex3));
System.out.println("aaa123aab".matches(regex3));
1.10 分组练习
需求:
将字符串:我要学学编编编编程程程程程程。
替换为:我要学编程
String str = "我要学学编编编编程程程程程程";
//需求:把重复的内容 替换为 单个的
//学学 学
//编编编编 编
//程程程程程程 程
// (.)表示把重复内容的第一个字符看做一组
// \\1表示第一字符再次出现
// + 至少一次
// $1 表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll("(.)\\1+", "$1");
System.out.println(result);
1.11 非捕获分组
非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来,不占用括号
- (? : 正则) :获取所有
- (? = 正则) :获取前面部分
- (? !正则) :获取不是指定内容的前面部分
//身份证号码的简易正则表达式
//非捕获分组:仅仅是把数据括起来
//特点:不占用组号
//这里\\1报错原因:(?:)就是非捕获分组,此时是不占用组号的。
//(?:) (?=) (?!)都是非捕获分组//更多的使用第一个
//String regex1 ="[1-9]\\d{16}(?:\\d|x|x)\\1";
String regex2 ="[1-9]\\d{16}(\\d Xx)\\1";
//^([01]\d|2[0-3]):[0-5]\d:[@-5]\d$
System.out.println("41080119930228457x".matches(regex2));
本笔记基于黑马程序员笔记整理编写,仅供学习参考,谢谢