正则
正则表达式是用来描述具有一定特征的字符串的特殊字符串。Regular Expression。
a+b*c : a+ c 个的 b
(d+e)f:()->组,改变了优先级 ,f 个的 d+e
a+bc+(d+e)*f : 组合成复杂的表达式
实例
ab*: a 若干个 b ->* 零个及以上 ,匹配: a ab abbbbb abbbbbbb 不能 bbbbb。
(cd)😦)->组,改变了优先级 ,若干个 cd,匹配: “” cd cdcd cdcdcd
ab(cd):a 若干个 b 和若干个 cd匹配: a ab abbbbb abbbbbbb acd acdcd abbbbbcd abcd
ab|(cd)*: |或的优先级低匹配: a ab cd
ab|c : 匹配 ab c
作用
验证、查找、替换、分割 。
字符集
默认情况下区分大小写。
普通字符
非特殊含义以外的字符,如 a b 中国 上海尚学堂 。 普通字符精确匹配
元字符与转义
hello
world.
hello,
regex.
day
1+1=2.
11=2
111=2
11111=2
1+1=2
123+111=234
ab=c
11=1
1+1=2 –>1+1=2 1+1=2
11=2 111=2 11111=2
字符类
自定义
由[]组,只匹配一个, 需要注意以下四个:
^: 如果在第一个位置,表示取反的含义。
-表示一个区间即范围
] 最近一个位置为:结束 ,如果要表示普通的]请加
\ 转义
. 在字符类中 不是代表任意的字符,代表自身 . 的含义。 如果需要表示原有的含义,挪动位置 或者\ 。
[ae134] -> a e 1 3 4
[(as)] ->a s ( )
[a-z] ->小写字母
[-]a-z[] -> -[] 及小写字母
默认|标准字符类
gray
grey
hello
hallo
Hello
Hallo
0123456789
h[ea]llo –>hello hallo
h(e|a)llo ->hello hallo
[-\abc] -> - \ a b c
\d\s ->一个数字和一个空白
[\d\s] –> 数字 或 空白
量词
匹配的过程中,需要指定次数
coke –> 不限个数的 O
co+ke –>至少一个 O
co?ke ->1 个或零个 O
co{0}ke ->0 个
co{5,}ke –>5 次及以上
co{5,8}ke –> 至少 5 次,最多 8 次
[1-9]\d{3} –>大于等于 1000 小于等于 9999 的数
[1-9]\d{2,4} –>大于等于 100 小于等于 99999 的数
1[34578]\d{9} : 匹配手机号
<[a-zA-Z]+\d?> ->网页标签
<[A-Za-z][A-Za-z0-9]> ->网页标签
贪婪模式
在匹配次数不定时如* {n,} +,匹配字符越多越好,默认模式即”贪婪模
贪婪模式 greedy(匹配字符越多越好,可回溯)
?懒惰模式 lazy reluctant (匹配字符越少越好,可回溯)
+独占模式 possessive(匹配字符越多越好,不可回溯) 用的较少 cokecolacoooooooooooooke
.*o –>贪婪模式
.{2,}o–>贪婪模式
.{2,}?o –>懒惰模式
.{2,}+o –>独占模式,不可回溯 没有匹配到内容。
<.+?> ->找出标签 不要标签内的内容。不是
<.+> <[^>]+>->找出标签 不要标签内的内容。不是<.+>
阻止贪婪有两种方式
1、 量词后面使用? 2、 使用取反。
边界
1)、边界不占用宽度,只是一个界限
2)、^ :开始 \b:单词边界 \B:非单词边界 $:结束
^:多行代表每行头 单行代表整个字符串的开始
$: 多行代表每行尾 单行代表字符串的结尾
\b 匹配前面或后面的不是\w
\B 匹配前面或后面的是\w
查找开头的 hello -> ^hello
找出 独立的单词 world -> \bworld\b
查找结尾的 world ->world$
选择符
| ->优先级低 ,满足匹配则停止,不会查找更优的方案
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 开始。必须认识组编号,为 ( 的位置
(")test\1 –> “第 1 个左括号中
((")test)\2 –> “第 2 个左括号中
((("))test2)\3 –> “第 3 个左括号中
"’["’] -> 错误的 找出合法的字符串"" 或’’
(["’])([^"’]+)\1 ->找出合法的字符串"" 或’’
非捕获组:(?:xxx) : 不缓存组
(["’])(?:[^"’]+)\1 ->不缓存第二组,不能引用第二组
(?:["’])(?:[^"’]+)\1 –>所有的组都没有缓存,不能再引用了。
找出合法的标签
<(b)>(?:[^<]+)</\1> -> 13321
<(a-zA-Z?)>(?:[^<]+)</\1> -->找出合法的标签
模式修改符
(?ism )*(?-ism)
i: insensitive 使正则表达式对大小写不敏感;(重点) s: singleline 开启“单行模式”,即点号“.”匹配新行符;
m: multiline 开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置
(?i)select(?-i) -> 不区分大小写。
零宽断言
前瞻(Lookahead) 后顾(Lookbehind)
(\w+)(?<=ing) –>匹配 singing testing 整个单词 -> 后顾
(\w+)(?=ing) -->匹配 sing test ->前瞻
常用类
java.util.regex Pattern Matcher String
一般在查找、替换、分割、组的使用
Pattern
Matcher
例子
/** * 构建正则表达式 Pattern 与 Matcher *
*/
public class TestReg01 {
public static void main(String[] args) {
String str ="^(\\d+)shsxt";
//转成正则表达式
Pattern p =Pattern.compile(str);
//匹配
Matcher m=p.matcher("abcshsxt11shsxt22shsxt");
//是否匹配
System.out.println(m.find());
m=p.matcher("11shsxt22shsxt");
System.out.println(m.find());
str ="((\\d+)(shsxt))";
p =Pattern.compile(str);
m=p.matcher("abcsxt11sxt22sxt");
//获取匹配的字符串
while(m.find()){
//组
System.out.println(m.groupCount()+"-->"+m.group()+"-->"+m.group(0));
//0-->整个表达式
//从 1 开始获取
System.out.println(m.group(2)+"-->"+m.group(3));
}
}
}
字符串与正则
String str ="and";
//完全匹配
boolean flag =str.matches("\\b(and|or)\\b");
System.out.println(flag);
str="\"happy\" and \"regex\" \"baidu\" or \"google\"";
//替换所有
str =str.replaceAll("\\b(and|or)\\b", "-->");
System.out.println(str);
//分割
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);
}