前言
正则是一把利器, 用好了编程事半功倍
但估计很多小伙伴初学正则时已经被其奇形怪状的字符给劝退了, 今天我们来将其解剖一下
三个部分
正则主要包含三个部分:
- 小括号() : 表示分组
- 中括号[] : 表示需要匹配的单个字符 以及表示区间范围或者随机样本
- 大括号{}: 表示重复出现的次数
比如:
1 | a{3}b{2} |
表示字符a
重复出现3次 字符b
重复出现2次
可匹配以下字符串:
1 | aaabb |
如果我想将字符a
和字符b
分离, 可以使用小括号分组功能, 比如:
1 | (a{3})(b{2}) |
那么$1
表示取出第一组内容aaa
, $2
取出第二组内容bb
在匹配单个字符的时候, 中括号写与不写都一样, 中括号主要的作用在于区间匹配和样本匹配:
区间匹配:
使用字符-
表示区间
1 | [a-z] //表示匹配小写a到z的26个英文字母 但凡出现26个字母中的任何一个 都匹配成功 |
样本匹配:
提供一个有限个数的字符的样本, 然后在样本中随机匹配
1 | [abcd] //表示匹配abcd这四个英文字母中任意一个 |
举例:
假如我写了一个正则表达式如下:
1 | [ab][cd] |
那么它将匹配到四个:
1 | ac |
是不是感觉像排列组合, 没错
在样本匹配模式下, 中括号中的内容相当于取或, 在正则中取或有一个专门的符号, 用|
表示
1 | [ab] 匹配a或b |
至此, 正则最核心的功能我们就学完了
扩展部分
关于出现次数:
字符
?
: 表示重复出现零次或一次字符
*
: 表示出现零次或多次字符
+
: 表示出现一次或多次
示例:
1 | a?b //可以匹配b 和ab |
如果放中括号中:
1 | [a?] //可以匹配a或者? |
也就是说一旦放到中括号中, 这三个字符将失去表示次数的含义, 成为一个普通的匹配字符
关于匹配内容:
- 字符
.
: 表示匹配除了回车和换行外的任意字符 - 字符
^
: 表示限定开头内容 - 字符
$
: 表示限定结束内容
我们挨个举例说明:
1 | .{3}b //表示任意字符出现三次然后再出现b |
可以匹配到以下内容:
1 | aaab |
如果我加个^
:
1 | ^1.{3}b //表示需要匹配的内容必须以1开头 |
假如我有两个字符串变量:
1 | String data1="1aaab"; //匹配成功 |
如果我去掉这个^
:
1 | 1.{3}b |
那么:
1 | String data1="1aaab"; //匹配成功 |
也就是说^
这个限定符, 是针对整个字符串进行匹配, 需要整体满足条件, 而不加限定符, 则可以进行局部匹配
$
和^
同理:
1 | .{3}b$ //表示需要匹配的内容必须以b结尾 |
如下:
1 | String data1="aaab"; //匹配成功 |
注意: 如果字符^
放到中括号中则表示取反
1 | [^a] //表示除了字符a外任意字符都行 |
学到这, 基本上可以实现大部分的正则匹配了
升级
为了方便开发, 正则提供了常用字符的简易写法, 也可以称之为别名
比如:
1 | [0-9] 可以使用 \d 代替 |
如果要取反, 那么直接将小写变成大写:
1 | \D 表示 [^0-9] |
现在 我们再来看几个常用的正则表达式:
1 | //手机号正则匹配 |
是不是感觉和蔼可亲多了呢
本文为作者原创 转载时请注明出处 谢谢
微信公众号二维码如下: