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));
 }