快速入门:RegExp 很多语言(前后端语言)都支持正则表达式
正则表达式作用:对 字符串/文本 执行模式匹配的技术
提取文章中所有英文单词
提取文章中所有数字
提取百度热榜标题
验证电子邮件格式
验证手机号格式
相关类 java.util.regex包下
Pattern类 正则表达式对象类/模式对象
获取正则表达式对象 静态方法compile("参数字符串") 返回Pattern对象
创建匹配器 成员方法matcher(字符串) 参数是需要处理的字符串,返回Matcher对象
这是条件匹配器,只要有满足的,就能找到
静态方法获取整体匹配器 matchers(regex,字符串) 看字符串整体是否满足regex的条件,返回boolean值
此方法不是用于寻找符合条件的字符串,而是用于验证字符串是否符合条件
底层调的是Matcher的mathers方法
Matcher类 匹配器类 用于对String处理
匹配寻找 成员方法 find() 找到返回true
匹配结果 成员方法 group(int) 返回的是结果
start(group) 返回之前find()匹配的初始索引 有group就是返回组的
end(group) 返回之前find()匹配的结束索引 有group就是返回组的
替换或添加 appendReplacement(StringBuffer,原字符串-》一般是find()匹配到的)
末尾添加 appendTail(StirngBuffer)
替换后返回 replaceAll(参数) 不会修改原来内容,返回的结果才是替换后的字符串,参数是正则表达式
replaceFirst()
PatternSyntaxException 异常类
底层实现
\\d表示0-9的任意一个数字 digit
find()方法
1 根据规则定位满足条件的字符串
2 找到后,
不分组的情况:
将找到字符串的开始索引,记录到匹配器对象的属性中 数组 int[] groups groups[0]中
将找到字符串的结束索引+1,记录到 group[1]中
将 结束索引+1,记录到 group[2]中,叫oldLast,继续下去找,就从这里开始了
分组的情况:第一个()就是第一组
将找到字符串的开始索引,记录到匹配器对象的属性中 数组 int[] groups groups[0]中
将第一组匹配到的字符串的开始索引,记录到 group[2]中;将 结束索引+1,记录到 group[3]中
将第二组。。继续下去,直到组完
将 结束索引+1,记录到 group[2]中,叫oldLast,继续下去找,就从这里开始了
group(int)
看源码:发现其是根据 group[0]和group[1]的位置截取字符串subString 返回
int参数是考虑正则表达式中用()分组的情况
0就是正则表达式整体全部取出,没有()一定要是参数0
1就是取出第一组(匹配还是按照整体匹配,但是只取出第一组)
2就是取出第二组。。。
参数不能超过()数量,否则抛异常
元字符
正则转义符 匹配特殊字符
字符匹配符
限定符 限定出现的次数
选择匹配符
定位符
分组组合 正则表达式()不能随便加
反向引用符
正则转义符 java是\\ 其他语言是\
. * + () $ /\ ? [] {} ^都要用到转移字符
字符匹配符
[] 可接收的字符序列 [abc] a或b或c都可以
[^] 不接收的字符序列 全部不接收,其他全部接收
- 连字符 A-Z A到Z
. 表示匹配除\n外所有字符
\\d 匹配单个数字字符
\\D 匹配单个非数字字符
\\w 匹配单个数字或大小写字母
\\W 匹配单个 非数字且非大小写字母
\\s 匹配任何空白字符 空格,制表符等
\\S 匹配任何非空白字符
?代表0或1个字符
+代表1个或多个字符
?i表示不区分大小写 ((?i)a)表示a不区分大小写
限定符
* 0-n次 abc* 表示abc都可以出现0-n次
- 1-n次
?字符重复0-n次 (abc)? abc整体出现0或n次
[n]只能输入n个字符 (abcde)[3] abcde中选3个出现
{n,}不少于n个
{n,m}不少于n个,但不多于m个
?紧随其他限定符之后 表示非贪心匹配,尽可能短的匹配,不加,就是贪心匹配,尽可能长的匹配
"oooooo" "o+?"只匹配单个o "o+"匹配所有o
选择匹配符
| 表示匹配满足 |左边的正则表达式 或 |右边的正则表达式
定位符 规定匹配字符串出现位置
^指定起始字符 ^([0-9]+[a-z]*) 起始字符必须是 一个数字开头+任意小写字母
指定结束字符 \[a-z\]+ 结束字符必须是一个或多个小写字母
\\b 匹配目标字符串的边界 边界指中间有空格或最后的结束位置 "abc"和 "abc bc"用 (bc)\\b 就可以匹配到
\\D 匹配非边界
分组,捕获
捕获分组:
(正则表达式)分组 是非命名捕获分组 组的名字自动按照()顺序填
(?<name> 正则表达式)是命名捕获分组 ,
给组取名 取名后,既可以根据编号获取,也可以根据取的名字获取
name的字符串不能包含任何标点符号,不能是数字开头
<>格式可以用''替代
非捕获分组 这里的()不是分组,要注意 group是(0)
(?:pattern)|的简化写法 "韩顺平教育|韩顺平同学"-》简化为 "韩顺平(?:教育|同学)"
(?=pattern) "window(?=98|2000)" 匹配的是window98/window2000中的window,其他window不匹配
(?!pattern)与=相反
反向引用:
需求:捕获4位数字,个位和千位相同,十位和百位相同
()表示分组,分组后可以在其后面 使用/重复 如:第一组 后面就可以\\1 这么用(正则表达式内)
正则表达式外,如Mather的方法的参数可以使用 $1表示第一组
解决:"(\\d)(\\d)\\2\\1"
括号:小括号就是括号内看成一个整体 ,中括号就是匹配括号内的其中一个,大括号就是匹配几次
当 ?. * 等写在中括号里面,它表示的就是实在在的问号,而不是限定符。
应用
汉字 \u0391-\uffe5
邮政编码 1-9开头的6位数 ^[1-9]\\d{5}$
QQ号码 1-9开头的5-10位数 ^[1-9]\\d{4,9}$
手机号码 要求必须是13,14,15,18开头的11位数
^1[3|4|5|8]\\d{9}$
String类中使用正则表达式
replaceAll(regex,替换的string)
matches整体匹配
split(regex)按照正则表达式分割
分割可能遇到空行问题,可以分割划线分析(就是split的分割坐标是全闭合的原因)