很抱歉各位,由于我本文章当时是粘贴,导致排版很不好,但由于又懒不想修改排版,遂提供原版的文档dock
连接下载:下载:https://wwpx.lanzouw.com/ix0zI0qsknzi 密码:8z3a
Java正则表达式
正则表达式越到后面学习的好难啊!
0、正则表达式中,字符分为 普通字符和元字符
1、普通字符: 大小写字母,数字 ,下划线,部分特殊符号, 非西文字符等
主要元字符:\ { } * ? + ( ) [ ] - | ^ $
- Pattern类和Matcher类 没有构造方法,只能用普通方法创建对象。
- Pattern pattern=Pattern.compile(正则表达式); 、
创建pattern对象。然后
Matcher matcher=pattern.matcher(待匹配字符串) 创建一个matcher 对象
然后就可以 matcher .方法(方法有很多,各种匹配) 去执行表达式的匹配了
方法:(每匹配一次待匹配字符串 ,待匹配字符串会减少正则表达式匹配成功的内容)很重要
lookingAt()方法要一开始就匹配成功正则表达式,就算在后面能满足正则表达式也是flase
find()方法,匹配是否满足正则表达式,能就true,否为flase
matches()返回待匹配字符串全部是否满足正则表达式,满足为true,否为flase
group () 方法 返回上一次(必须,不然也报错)匹配正则表达式成功(也是)的字串,不然会报错
start()方法 返回匹配成功正则表达式的开始索引位置
end()方法 返回匹配成功的正则表达式的结束索引位置
例如 “hello heloo” 匹配ell start返回1,end返回4
reset()方法,作用是把matcher的待匹配串给赋值了一个新的字符串
- java 正则表达式匹配规则
\d 表示0-9 的任意一个数字
\D 匹配一个 非数字 字符 \d的相反 可以理解
. 表示任意 一个 字符
\w 匹配一个字母 ,数字,下划线
\W 与\w 相反
\s 匹配 空格 字符 还有 tab 键 也就是 \t \f \v \n \r \v(垂直制表)
\c 表示crtl键 加a-z 和A-Z 不然当 转义c处理。
\cc 表示crtl+c
\S 与\s 相反
* 重复匹配 \d* 这样, \d 只能匹配一个数字 加了* 可以配 0到正无穷 那么多位的 数 组成的数字 比如 ,1 ,11, 111, 1111 ,22222都可以 。第一个逗号前面是空
+ 也是重复匹配 和*一样 但是 +要匹配的是 1 到正无穷位的 字符组成
比如 \d+ 和上面的列举一样 但是第一个逗号 前不能是空,你最少 也得是 一个数字
? 也是重复匹配 匹配 0个或一个 字符 比如 \d?
要是匹配成功 待匹配的字符串 必须 是0位 数字(也就是空字符) 或者 一位 数字 (比如0-9 其中的一个 )二位数都是匹配失败 比如 :22
{数字} 重复匹配 指定次数 比如 \d{3,8} ,\d 表示匹配一个 数字 ,{3,8} 表示 这个数 是3个数字 到 8个数字之间,比如 333,2222,77777,12345678 这种 ,{3}表示匹配3 个字符,{3,}这种 表示 3到无穷大 个 字符 组成。
正则表达式匹配默认 贪婪模式,就是最大化匹配,能不让其他正则表达式 匹配,就不让它匹配,
在重复匹配符 后加 ? 可以变成非 贪婪模式,就是尽可能少的匹配 字符串,让其他正则表达式 也能匹配。
还有一直叫占有模式,在后面加个 + 这个符号就是占有模式了, 就是不会回溯,匹配一旦错了,就错了,如果你想更懂,了解 正则表达式 匹配机制。就明白了 可以看下面的标注的链接 里面有个 正则表达式的性能 ,就明白了
4、
\\b 匹配单词的边界,单词 :因为单词 中文单词 数字,并且这些单词不互斥。
字符:英文字符,中文字符,空格,制表符,换行。
意思是 单词和字符之间的部分, 你想想,这部分是空的 ,中间什么都没有,就像 空字符串一样 “” 这样的,我觉得,这拿来分割有用,提取,提了个寂寞。
\\B与\\b相反
- 表示范围 比如 a-z 就是a到z的字母
匹配开头与结尾
^表示开头,$表示结尾
例如 ^a\d+b$ 匹配的可以有 a253b 或者 a2b
解释:^表示开头 a 表示 字符a ,\d表示一个数字 +表示1个到无穷个数字 ,b表示 字符b ,$表示结尾 ,结合起来就是 字符串 以a开头 以b结尾 中间1个数字以上
[ ]匹配指定范围 吸 不太好说
举例子吧, [123456789]不太好看,[1|2|3|4|5|6|7|8|9]中|是或的意思 ,就是 里面数字 随便一个 ,可以简写[0-9] 这样 还有[a-z] ,[A-Z] 表示 范围内 其中一个字符
再来个例子 :把上面结合起来 [0-9a-zA-Z]{5} 可以匹配 由数字 字母 组成的 5位字符串。比如 5a6F9 可以匹配成功
在[ ]里面加个^ 表示取反的意思 比如:[^0-9] 表示单个字符, 除了0到9 的数字之外 的 其他字符。换个意思,就是 这个待匹配的字符 不能是个数字。
( ) 括号匹配 ,像数字的 提公因式一样
比如 :正则表达式 study\\s(math|english|chinese)
可以匹配 study math或者study english或者study chinese之一的 一个字符串
( )分组匹配 ()其实是有两个意思的 第一个是上面的,第二个是这里的。比如这个 “([a-z]+)\\-([a-z]+)” 规则
待匹配字符串:english-book
分组可以在用Pattern 类和Macher类时候,可以提取分别提取分组的内容,可以单独输出 第一个括号匹配的内容,和第二个括号里面的内容。
还有一个功能,(a)(b)\\1 规则,\\1是 引用第一个组 ,这种引用最多到\\9 ,比如把第一个 括号的内容 匹配的 给\\1 去 第二个b匹配了, 就给 \\2 去
- 非贪婪匹配 ,一般正则表达式匹配都是贪婪模式,比如
([0-9]+)(0*) 对于 188800000 group(1)方法 内容就不是 1888了,而是全部。也就是 188800000
若想非贪婪 加个?就可以了 上面的 :([0-9]+?)(0*) 这样的正则表达式,非贪婪我理解就是 在满足匹配规则情况下,尽可能少的匹配 比如比如 (18880) (0000)这样也可以满足,(188800) (000) 也可以满足匹配。 但是最低是 (1888)(00000),不能(188)(800000)因为这样不满足匹配规则。
| 多选字符,在上面的 [ ]中用过了 就是 或的意思
. 匹配除了 \n 的其他任意 字符
正则表达式也有 优先级 ,从左往有。 以下字符 优先级从高到低 依次为:
\ 转义字符
() 与(?=)与 (?:)和[ ] 括号
* ? + { }
^ $ 任何字符* (重复匹配) *字符 (就是 *a 可以匹配 1a ba这种 *表示任意字符)
- 反向引用
我的理解是 正则表达式 少写了几遍,代码重用型增加
(?<自定义名字>正则表达式)
想要引用上一个的正则表达式匹配的值
加\\k<你刚刚定义的正则表达式 名字>
还有一中是 按位置 在( ) 规则的使用时候讲了
这两个是捕获型,就是group()可以在括号填写数字,可以输出 指定匹配的位置
(?:正则表达式) 非捕获组
(?=正则表达式) 零宽断言
比如,有一个正则规则 :thankful(?=ly)
待匹配字符串为:thankfully
这个正则意思是:有一个字符串 前面是thankful 紧接着后面是ly
那么就会匹配成功,输出thankful,而不是thankfully。因为是从字符串0索引位置开始计算,不太好说 用文字。
为什么要叫是零宽度呢? 因为 下一次匹配 是在thankful之后开始的,而不是thankfully之后开始匹配字符
可以这么理解 先判断 是否有 ly的字符串,看它紧邻的前面的字符串 与ly 前面是否一样,一样就true,否,相反。如果后面有字符串,也看紧邻的字符串是否和后面的一样,一样的道理
或者这么理解:if ly正则表达式满足不 满足 看前面紧邻的是否满足,满足,再看后面的是否满足。满足 就ok。
这个也是非捕获组,用括号括起来,group方法不会输出括号的里面的
最新:比如字符串是:abcdefghijkl 往前扫,起始位置不一样
正则规则 (?=def)defg(?=hij)
它的意思是 defg 字符串 在d字符开始 匹配def
然后在 第二个括号是 在g之后的字符开始匹配 也就是从h字符开始,然后 hij 匹配成功
(?<=正则表达式) 往后扫 起始位置不一样
比如 abcdefg 然后(?<=bc)def(?<=ef)
第一个bc指的是 在de前面 紧挨这bc字符串,
第二个正则表达式 f指的是 匹配的 def 从f开始往后扫 ef
(?!正则表达式) 往后扫
比如 字符串abcdefghijkl
正则规则: de(?!g)
意思是 从字符串往后扫,然后,在f的位置,判断 f不是g 为 true
然后 (?!g) 这个规则匹配成功的 前面 de 和正则的de 匹配为true
所以成功
如果括号在 前面 ,包括fg ,在f位置包括f 开始 从右往左扫,扫到f的位置
(?<!正则表达式) 往后扫
比如 字符串 : abcdefghijklmn
正则规则:(?<!de)fg
从右往左扫 扫到fg 然后 不包括fg ,在f的前面的字符 e开始 扫是否满足括号的表达式,明显 de 是满足的 ,但是有的叹号 表示取反,就是 说,de不等于de ,判断可得,这是错的 所以输出为空
如果括号在后面 就的包括 fg字符了, 就是从g字符,包括g字符,开始右到左扫,了。相当于问:fg字符串的 包括fg 左边 的字符串是不是fgh 是为true 否就false
结果是空因为正好匹配,!表示不相等 就错误,就为空
忽略大小写 (?i) ab 忽略ab的大小写
A(?i)bc 忽略 bc的大小写
99、巧妙用法 “[Hh][1-6]” 组合匹配 可以匹配 H1
Javaassist 特殊参数
参靠链接(正则表达式匹配机制):我觉得这个比较全,但是有些还是难明白
参考链接(断言):https://blog.51cto.com/u_13984191/5039634
参考链接(贪婪,非贪婪 ,占有):
JAVA 正则表达式的三种模式: 贪婪, 勉强和占有的讨论 - kuroniko - 博客园
https://blog.csdn.net/xiaoliuliu2050/article/details/80758218