java正则表达式(很全)个人学习总结

"本文详细介绍了Java中的正则表达式,包括元字符、Pattern与Matcher类的使用,如`matches()`、`find()`和`group()`方法。讲解了重复匹配符如`*`、`+`、`?`以及量词`{n,m}
摘要由CSDN通过智能技术生成

很抱歉各位,由于我本文章当时是粘贴,导致排版很不好,但由于又懒不想修改排版,遂提供原版的文档dock 

连接下载下载:https://wwpx.lanzouw.com/ix0zI0qsknzi 密码:8z3a​​​​​​​



Java正则表达式

正则表达式越到后面学习的好难啊!

0、正则表达式中,字符分为 普通字符和元字符

1、普通字符: 大小写字母,数字 ,下划线,部分特殊符号, 非西文字符等

主要元字符:\    { }    *    ?    +     ( )     [ ]    -    |    ^    $

  1. Pattern类和Matcher类 没有构造方法,只能用普通方法创建对象。
  2. 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的待匹配串给赋值了一个新的字符串

 

 

 

 

 

  1. 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 去

 

 

 

 

 

  1. 非贪婪匹配 ,一般正则表达式匹配都是贪婪模式,比如

([0-9]+)(0*) 对于 188800000 group(1)方法 内容就不是 1888了,而是全部。也就是 188800000

若想非贪婪 加个?就可以了   上面的 :([0-9]+?)(0*)  这样的正则表达式,非贪婪我理解就是 在满足匹配规则情况下,尽可能少的匹配 比如比如 (18880) (0000)这样也可以满足,(188800) (000) 也可以满足匹配。 但是最低是 (1888)(00000),不能(188)(800000)因为这样不满足匹配规则。

 

 

 

| 多选字符,在上面的 [ ]中用过了 就是 或的意思

. 匹配除了 \n 的其他任意 字符

 

正则表达式也有 优先级 ,从左往有。 以下字符 优先级从高到低 依次为:  

\ 转义字符

() 与(?=)与 (?:)和[ ] 括号

* ? +  { }  

^ $   任何字符* (重复匹配) *字符 (就是 *a 可以匹配 1a  ba这种 *表示任意字符)

  1. 反向引用

我的理解是 正则表达式 少写了几遍,代码重用型增加

(?<自定义名字>正则表达式)

想要引用上一个的正则表达式匹配的值

\\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 特殊参数

 

参靠链接(正则表达式匹配机制):我觉得这个比较全,但是有些还是难明白

Java 正则从入门到精通 | JAVACORE

 

 

参考链接(断言):https://blog.51cto.com/u_13984191/5039634

参考链接(贪婪,非贪婪 ,占有):

JAVA 正则表达式的三种模式: 贪婪, 勉强和占有的讨论 - kuroniko - 博客园

https://blog.csdn.net/xiaoliuliu2050/article/details/80758218

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值