正则的基本语法
1 普通字符
2 转义字符
\n 表示换行符
\t 制表符
\ 代表\本身
^ $ (, ) ? + 匹配这些字符
标准字符集合
注意大小写的 大写时相反的意思
\d 任意一个数字0-9
\w 任意一个字母或数字或下划线,也就是A-Z,a-z,0-9,;
\s 包括空格,制表符,换行符等空白的其中任意一个
. 小数点可以匹配任意一个字符除了换行符 如果要匹配包括“\n"在内的所有字符
一般使用[\s\S]
自定义字符集合
[ab5@] 匹配a或b或5或@
[^359] 取反
[f-k] f-k之间的字母
[^ A-F0-3] A-F0-3 之外的任意字符
正则表达式的特殊符号,被包含在中括号内失去特殊意义除了^ 和
标准字符集合,除了小数点外,如果被包含与中括号,自定义字符集合将被包含该集合
[\d.-+]将匹配:数字小数点 + -
量词
修饰匹配次数的特殊符号
{n} 表示重复n次
{m,n}表示最少重复m次,最多重复n次
{m,} 表示最少重复m次
? 匹配表达0次或1次相当于{0,1}
+ 表达式至少出现1次 想当与{1,},
* 表达式不出现或出现任意次,相当于{0,}
匹配次数中的贪婪模式匹配字符越多越好 默认
匹配次数中的非贪婪模式 匹配字符越少越好,修饰匹配次数的特殊后在加上"?"
字符边界
零宽 复合某种条件的位置
^与字符开始的地方匹配
$ 与字符结束的地方匹配
\b 匹配一个单词边界 前面的字符和后面的字符不全是\w
第一想第一的\A
每行最后 $
全部最后 \Z
选择符和分组
表达式
| 匹配左边和右边的
() 捕获分组 1,在被修饰次数的时候 括号中的表达式可以被整体修饰
2,去匹配结果的时候 括号中的表达式匹配到的内容可以被单独得到
3,每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1
开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式
匹配的文本
(? :Expresion) 一些表达式,不得不使用() ,但又不需要担保()中子表达式匹配的内容
这时可以用非捕获组来抵消使用()带来的副作用
反向引用(\nnn)
· 每一对()会分配一个编号,使用()的捕获会根据左括号的顺序1开始自动编号
通过反向引用,可以对分组已捕获的字符串进行引用
预搜素(零宽断言)
(?=exp) 断言自身出现的位置的后面能匹配表达式exp
(?<=exp) 断言自身出现的位置的前面能匹配表达式exp
(?!exp) 断言此位置的后面不能匹配表达式exp
(?<!exp) 断言此位置的前面不能匹配表达式exp
再Java中使用正则用到的两个包
import java.util.regex.Matcher;
import java.util.regex.Pattern;
创建正则表达式对象
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class z(){
public static void mian(String[]args){
//正则表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher("asfsdf223&3323");
//尝试将整个字符序列与该模式去匹配
boolean yesorno = m.matches();
//该方法扫描输入的序列,查找与改模式匹配的下一个子
boolean yesorno2 = m.find();
while(m.find()) {
//group(),group(0)匹配整个表达式的子字符串
System.out.println(m.group());
System.out.println(m.group(0));
}
}
}
测试分组
() 捕获分组 1,在被修饰次数的时候 括号中的表达式可以被整体修饰
2,去匹配结果的时候 括号中的表达式匹配到的内容可以被单独得到
3,每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1
开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式
// 测试分组的处理
// 表达式对象
Pattern p = Pattern.compile("([a-z]+)([0-9]+)([A-Z]+)");
// 创建Matcher对象
Matcher m = p.matcher("aasd11AA**erewrw22DD*were44DD");
while(m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
正则表达式切割字符串
public static void main(String[] args) {
String str ="a345b234c";
String[] arrs = str.split("\\d+");
for(int i=0; i<arrs.length;i++) {
System.out.println(arrs[i]);
}
System.out.println(Arrays.toString(arrs));
}