重点前言
***一个正则表达式就是一个描述规则的字符串,可以适配任何语言
在Java中一个\表示转移字符,所以一般需要多加一个\
在[ ]内一些特殊的符号如果想在正则内存在,则需要使用\符号的形式让它转义,例如:[ \-];
正则中匹配到的字符会存在内存中
断言:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。***
进入正题
一、正则基本符号
指定字符:可以匹配指定的字符;
. :匹配除了换行符以外的任意一个字符
*:可以匹配任意个字符(多个)==={0,} 等价于 *
****匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配“z”以及“zoo”;正则表达式“.*”意味着能够匹配任意字符串。****
+:可以匹配至少一个字符(多个)==={1,} 等价于 +
***匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。****
?:可以匹配零个或者一个字符==={0,1} 等价于 ?
****匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。此元字符还有另外一个用途,就是表示非贪婪模式匹配,****
***贪婪匹配:尽可能多的匹配字符;非贪婪匹配:以最底线的长度匹配字符;****************
\w:匹配一个字母或者数字或下划线
\W:与w效果相反(一个)
\s:匹配一个空白符(空格,TAB键)
\S:与s相反(一个)
\d:匹配一个数字(0~9)
\D:匹配一个非数字(和d效果相反)
\b :匹配单词的开始或者结束
\B:匹配非单词的开始或者结束
^:匹配字符串的开始,也可以指定字符串的开始是否符合标准:/^java*/,表示字符串开头是否是Java子串,用于[ ]内是表示相反的意思
$:匹配字符串的结束,也可以指定字符串的结尾是否符合标准:/*java$/,表示字符串的结尾是否是java子串。
二、修饰基本正则符号的表达式:
{n}:可以匹配N个字符,例如:“\d{6}”:匹配任意六个字符
{n,m}:可以匹配N~M个字符
{n,}:可以匹配至少N个字符
字符1 | 字符2:表示匹配字符1或者字符2
*************[ ]:可以匹配范围内的一个字符*****
*******在很多情况中,【 】会代替元字符的使用,比如:[a-z]就代替了\w[a-z]***********************
1、[a-f]: 可以匹配范围内的一个字符
2、[a-f0-9]:可以匹配a-f或者0-9中的一个字符
3、[a-f0-9_]:可以匹配a-f或者0-9中的一个字符,并且要在任意位置上有一个_
4、[^0-9]:匹配不是0-9范围内的字符
5、分组表示匹配部分();---->捕获组,用括号括起来的部分就是正则中的一个部分,可以同样使用修饰符表达式。
6、非捕获组(?:EXpression);---->让匹配到的内容不存放到内存中,会导致内容丢失,让后方的获取符获取不到。
7、反向引用:\n[nn]
***每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号,通过反向引用,可以对分组已捕获的字符串进行引用***
8、零宽断言
***只进行子表达式的匹配,匹配内容不计入最终的匹配结果,不放入内存,是对位置的匹配**********
一、(?=exp):断言自身出现的位置的后面能匹配表达式exp
二、(?<=exp):断言自身出现的位置前面能匹配表达式exp
三、(?!exp):断言此位置的后买你不能匹配表达式exp
四、(?<!exp):断言此位置的前面不能匹配表达式exp
三、正则表达式匹配:
一般可以先生成一个Pattern对象,再用这个对象去进行匹配
语法1:boolean b=Pattern.matches(pattern, String);----->用于少量判断
语法2:Pattern pattern=Pattern.compile(“正则表达式”);----->用于多量判断
pattern.matcher(“字符串”).matches();
语法3:String matches 方法
String str ="az";
String v ="[abcd][a-z]";
boolean ans = str.matches(v);
四、正则表达式的提取:
一、创建一个Pattern的对象
Pattern compile1=Pattern.compile("[a-z]{4,6}@[a-zA-Z0-9]{4,6}(\\.[a-z]+){2}");
二、利用Matcher对象为后续Pattern对象和字符串进行比较和提取做准备
Matcher matcher1=compile1.matcher(name);
三、利用Matcher对象的find()方法和group([int])方法来得到匹配的字符
while(matcher1.find()){
System.out.println(matcher1.group());
}
注意:正则的分组是以()为准的,如果没有()进行分割,则通过group()和group(int)得到的都是一个结果,是一个完整的字符串。