正则表达式
正则表达式是用来描述具有一定特征的字符串的特殊字符串。例如"ab*“匹配"a 若干个b”,"a,ab,abb"等均可匹配。
1. 字符类
1.1 自定义字符类
由[ ]组,只匹配一个,需要注意以下四个:
- ^:如果在第一个位置,表示取反的含义
- -:表示一个区间即范围
- ]:结束 ,如果要表示普通的]请加 \
- \:转义
- .:单独表示.自身,如果想表示任意字符加上\
例:
[ae134]->ae134
[(as)]->as
[a-z]->a~z之间的小写字母
[-\]a-z\[]->-[]及小写字母
1.2 标准字符类
字符 | 含义 | 字符 | 含义 |
---|---|---|---|
\d | 0~9的数字 | \D | \d取反 |
\w | A~Z a~z 0~9 | \W | \w取反 |
\s | 空格,制表符,换行符 | \S | \s取反 |
1.3 贪婪模式
在匹配次数不定时如*,{n,},+匹配字符越多越好,默认模式即贪婪模式。
- 贪婪模式greedy(匹配字符越多越好,可回溯)
- ?懒惰模式lazy reluctant(匹配字符越少越好,可回溯)
- +独占模式possessive(匹配字符越多越好,不可回溯)
1.4 边界
边界不占用宽度,只是一个界限。
- ^:多行代表每行头,单行代表整个字符串的开始
- $:多行代表每行尾,单行代表字符串的结尾
- \b:匹配前面或后面的不是\w
- \B:匹配前面或后面的是\w
1.5 选择符和分组
选择符|:
he|hello –>只匹配he,不匹配hello
hello|he->匹配he与hello
分组():
匹配 ab c -> ab|c
匹配 ab ac -> a(b|c)
只匹配 get -> \bget\b
匹配 get 和 getValue -> getvalue|get
get(value)?
获取 and or -> \band\b|\bor\b \b(and|or)\b
1.6 零宽断言
- (?=exp):先行断言,断言自身出现的位置的后面能匹配表达式exp
- (?<=exp):后发断言,断言自身出现位置的前面能匹配表达式exp
- (?!exp):断言此位置的后面不能匹配表达式exp
- (?<!exp):断言此位置的前面不能匹配表达式exp
2. 常用类
2.1 Matcher
代码:
public class RegularDemo01 {
public static void main(String[] args) {
String str = "(\\d+)hahaha";
//转成正则表达式
Pattern p = Pattern.compile(str);
//匹配
Matcher m = p.matcher("abchahaha");
//是否匹配
System.out.println(m.find());//false
m = p.matcher("11hahaha");
System.out.println(m.find());//true
str = "((\\d+)(hahaha))";
p = Pattern.compile(str);
m = p.matcher("11hahaha22hahaha");
//获取匹配的字符串
while(m.find()){
//组
System.out.println(m.groupCount()+"-->"+m.group()+"-->"+m.group(0));
//0-->整个表达式
//从 1 开始获取
System.out.println(m.group(2)+"-->"+m.group(3));
}
}
}
2.2 字符串与正则
代码:
public class RegularDemo02 {
public static void main(String[] args) {
String str ="and";
//完全匹配
boolean flag =str.matches("\\b(and|or)\\b");
System.out.println(flag);//true
str="\"happy\" and \"regex\" \"baidu\" or\"google\"";
//替换所有
str =str.replaceAll("\\b(and|or)\\b", "-->");
System.out.println(str);//"happy" --> "regex" "baidu" -->"google"
//分割
str="\"happy\" and \"regex\" \"baidu\" or\"google\"";
//切割
String[] arr=str.split("\\b(and|or)\\b");
for(String temp:arr){
System.out.println(temp);
}
arr=str.split("m");
//没有对应的,返回本身
for(String temp:arr){
System.out.println(temp);
}
//任意字符
str ="192.168.1.234";
arr=str.split("\\.");
//注意转义
for(String temp:arr){
System.out.println(temp);
}
}
}