正则表达式
正则表达式大家应该都不陌生,我今天从零开始介绍我自己的学习经验和步骤!
字符组
在一对方括号 [ 和 ] 之间列出所有可能出现的字符,包括可见以及不可见的字符;例如:
[123]
表示可以匹配1、2、3的单个字符。
1字符组的范围表示
如果可以匹配的字符有规律性并且范围比较大,比如0、1、2、3、4、5、6、7、8、9,表达式写成
[0123456789]
这样就显得复杂也不美观,所以引入符号“-”,使用 [x-y] 的形式表示在闭区间x到y范围内的字符,上式可以写成
[0-9]
【注意】:-范围表示法必须遵循ASCII编码的先后顺序,即上式不可写作 [9-0] ,而一些令人困惑的表达式也尽量不要使用,比如 [0-z] 因为该式涵盖了在ASCII编码表中从0到z的全部字符(不仅仅只有数字和小写字母)。如果想要表示多个范围,比如匹配数字、大写字母和小写字母,表达式可以写作
[0-9a-zA-Z]
2元字符与转义
在表达式中有特殊功能而不作为字符的一部分字符,称为元字符。比如前文讲过的:[ ] - 都是元字符,如果想要恢复它们本来的字符属性就要做一些特殊处理。先看一般情况,取消元字符特殊含义的操作叫做转义,操作是在表达式中的元字符前加反斜杠 。特殊情况就是表示范围的横线 - ,当其紧邻左方括号 [ 时就作为普通字符处理,其他情况都作为元字符表示范围。
【注意】
1、横线 - 也支持反斜杠的转义,即[0-9]表示0、-、9三个字符。
2、右方括号 ] 不需要转义。
3排除型字符组
当需要表示的字符组范围很大,写起来不方便,而恰巧它的补集(全集指所有字符)方便表示,引出了排除型字符组[^…] ,表示在当前位置匹配一个没有列出的字符,请注意是“必须匹配一个没有出现的字符”,而不是“不要匹配列出的字符”。例如:
[^0-9][^0-9]
可以匹配“QQ”,但不可以匹配“Q”。
【注意】紧跟在 ^ 之后的 - 不是一个元字符!而^自身也是元字符,当且仅当^紧跟[时,否则表示它作为字符的含义。
4字符组简记法
常见的字符组简记法有d([0-9])、w([0-9a-zA-Z_])、s([ vf])
【注意】w可以匹配下划线,不等价于[0-9a-zA-Z]。另外字符组简记法可以单独出现,也可以使用在字符组中,如
`[0-9a-zA-Z]`可以写成`[da-zA-Z]`
正则表达式也提供了上面三种常用简记法的排除型:D、W、S,这三种分别对应各自的补集(全集是指所有字符,即[dD]可以匹配任意字符,剩余二者同理)。
【再次注意】第一,使用字符组简记法最好不要出现单独的 - ;第二,上面描述的简记法都是针对ASCII编码而言的;第三,字符组简记法不止这三种,还有其他(也可能根据不同的编程语言衍生出新的简记法),等遇到了再说。
5字符组的运算
当我们所研究的问题要求我们的全集不是所有字符,排除型字符组就显得不是那么的好用了。比如我需要匹配字母表第1、5、9个小写字母,把所有字符看作全集显然不合适,而把所有小写字母看作全集就比较合适,但是写成[b-df-hj-z]就比较复杂而且容易搞错,Java就允许使用逻辑与(&&,也可以理解为取交集)来解决这个问题,即写成:
[a-z]&&[^aei]
喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资料的也可以私信我!
祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发!