1.正则表达式
正则表达式是用来描述具有一定特征的字符串的特殊字符串。
2.字符集
普通字符:
写什么就匹配什么,非特殊含义以外的字符
元字符与转义
3.字符类
3.1自定义类
由[ ]组成,只匹配一个,需要注意以下四点:
^:如果出现在第一个位置,表示取反的含义,表示不是里面的值都能够匹配
例:[A-Z]表示取26个字母大写中的一个 [^A-Z] 表示除了26个字母大写其他都可以取
- :表示一个区间即范围
] : 最近一个位置为:结束 ,如果要表示普通的]请加 \
\ : 转义
. 在字符类中 不是代表任意的字符,代表自身 . 的含义。 如果需要表示原有的含义,挪动位置 或者加 \ 。
3.2标准字符类
3.3量词
- co*ke –> 不限个数的 O
- co+ke –>至少一个 O
- co?ke ->1 个或零个 O
- co{0}ke ->0 个
- co{5,}ke –>5 次及以上
- co{5,8}ke –> 至少 5 次,最多 8 次
3.4贪婪模式
在匹配次数不定时如 *, {n,}, + 匹配字符越多越好,默认模式即”贪婪模式“
贪婪模式 greedy(匹配字符越多越好,可回溯)
? 懒惰模式 lazy reluctant (匹配字符越少越好,可回溯)
- 独占模式 possessive(匹配字符越多越好,不可回溯) 用的较少
例 :
\d*1--> 先取全部字符串 再回去找符合要求的匹配字符
\d?1-->取最少满足要求的字符 可以回溯
\d+1-->先取全部字符串 不会回溯
4.边界
边界不占用宽度,只是一个界限
- ^ :开始
- \b :单词边界
- \B :非单词边界
- $ :结束
- ^ :多行代表每行头 单行代表整个字符串的开始
- $ : 多行代表每行尾 单行代表字符串的结尾
- \b : 匹配前面或后面的不是\w
- \B : 匹配前面或后面的是\w
查找开头的 hello -> ^hello
找出 独立的单词 world -> \bworld\b
查找结尾的 world -> world$
5.选择符与分组
5.1选择符|
| ->优先级低 ,满足匹配则停止,不会查找更优的方案
he|hello –>只匹配 he,不匹配 hello
hello|he->匹配 he 与 hello
5.2分组()
()代表一个组 --> (ab)
反向引用: \ 内部默认缓存,从第一个左括号计算,编号为 1 开始。
反向引用的用法:
(\d)ab(ac)\1\2-->0abac0ac 前面匹配的第一个组存的是(0) 第二个组存的是(ac) 所以 匹配的是 0abac0ac
非捕获组: (?:xxx) : 不缓存组
(?:\d)ab(ac)\1\2-->0abacac 因为(?:\d)不计入缓存中,所以第一个组存的是(ac) 所以匹配的是 0abacac
5.3模式修改符
(?ism )*(?-ism)
i : insensitive 使正则表达式对大小写不敏感;(重点)
s : singleline 开启“单行模式”,即点号“.”匹配新行符;
m : multiline 开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置
(?i)select(?-i) -> 不区分大小写。 重点记这个!
6.零宽断言
本身不占位置
例:
test(?ing) 表示假设要匹配的字符串test后面会出现ing 若出现 则提取test 未出现则不提取
(?<=ing)test 表示假设要匹配的字符串test前面会出现ing 若出现 则提取test 未出现不提取
7.常用类
String类中用到正则的地方
String str = "kahd1kldsfkls2shsxt121lkdflds4lksjf3s"; String str2 = "abcd123456"; //分割 String[] arr = str.split("\\d"); //遇到一个数字就分割一次 System.out.println(Arrays.toString(arr)); //替换 System.out.println(str.replaceAll("\\d","+"));//将数字替换成 "+" System.out.println(str); //匹配 matches 完全匹配 System.out.println(str2.matches("\\w{6,10}"));
Pattern模式器
Pattern pattern = Pattern.compile("(haha|hehe)(\\d*)"); 定义格式 //匹配器 Matcher matcher = pattern.matcher("haha123a11hehe45657hehe10101"); 匹配字符 //find() 匹配的是子串 true表示有这样的子串 false表示找不到了 System.out.println(matcher.find());haha123 System.out.println(matcher.find());hehe45657 System.out.println(matcher.find());hehe10101 System.out.println(matcher.find()); System.out.println(matcher.find());
match()方法 完全匹配
System.out.println(matcher.matches());
groupCount 分组的组数
while(matcher.find()){ System.out.println(matcher.groupCount()); System.out.println(matcher.group()); //group(0) 或者 group() 返回匹配到的整个子串. 1.... 匹配不同分组的内容 System.out.println(matcher.group(0)+"---->"+matcher.group(1)+"---->"+matcher.group(2)); }