介绍
作为程序员,在比较字符串数据的时候最高频使用的就是正则表达式了。
但是很多时候,都是一次配置完毕后面很多年都不会在进行修改。
之后渐渐的就容易忘记了正则表达式的各种概念等信息。
我也同样面临了相同的问题,所以这里我打算写一篇关于正则表达式的常用字符的介绍。也方便之后自己的各种查询
正则表达式
正则表达式:regular expression
。它主要是通过一种约定的字符比较规则匹配字符,用来检测一连串的字符串中是否包含某种表达式定义的字符规则。
我们可以用表达式,来判断一串字符串中是否满足你指定的格式。
例如是否手机号,座机号,规范的编码,网址,身份证号,地址,密码强度验证,日期格式,等等。
只要你需要比对字符串是否按照你的要求输入,都可以通过正则表达式轻松的实现。
基础概念*
和?
我们在使用正则表达式比较之前。我们通常都使用过*
或者?
作为通配符进行过比较或者查找
?
:通配符匹配文件名中的 0 个或 1 个字符。
*
:通配符匹配零个或多个字符。
而针对比较复杂的字符串,这两个通配符就不太够了。然后发展出来正则表达式。我们按照表达式约定的字符,定义匹配规则进行查找。
所以,我们学习正则表达式,需要先了解它的各种字符定义的逻辑。
换行符等文档格式字符的匹配关键字
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于 \cL。 |
\n | 匹配一个换行符。等价于 \cJ。 |
\r | 匹配一个回车符。等价于 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 。 |
\S | 匹配任何非空白字符。等价于 [ \f\n\r\t\v] |
\t | 匹配一个制表符。等价于 \cI。 |
\v | 匹配一个垂直制表符。等价于 \cK。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
特殊字符的匹配关键字
许多字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\
放在它们前面。
所谓特殊字符,就是一些有特殊含义的字符,简单的说就是我们正则表达式使用的关键字。例如如果要查找字符串中的 *
符号,则需要对*
进行转义,例如: \*
下表列出了正则表达式中的特殊字符:
字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \$ |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \) |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \* |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+ |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. |
[] | 标记一个中括号表达式的开始。要匹配 [ ,请使用 \[ |
? | 匹配前面的子表达式零次或一次。要匹配 ? 字符,请使用 \? |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, n 匹配字符 n ,\n 匹配换行符。 '\\ ' 匹配 "\ "。而 '\( ' 则匹配 "( " |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。 |
{ | 标记限定符表达式的开始,和结束 |
| | 指明两项之间的一个选择。 |
限定匹配符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zin* 能匹配 zi 以及zinnnnn 。* 等价于{0,} 。 |
+ | 匹配前面的子表达式一次或多次。例如,zi+ 能匹配 zi 以及 zii ,但不能匹配 z 。+ 等价于 {1,} 。 |
? | 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 do 、 does 中的 does 、 do zinyan 中的 do 。? 等价于 {0,1} 。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'z{2}' 不能匹配zinyan 中的 z ,但是能匹配 zziinn 中的两个 z 。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'z{2,}' 不能匹配 zinyan 中的 z ,但能匹配 zzzzinyan 中的所有 z 。z{1,} 等价于 z+ 。z{0,} 则等价于 z* 。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,a{1,3} 将匹配 zinyaaaan 中的前三个 a 。a{0,1} 等价于 a? 。注意:逗号和两个数之间不能有空格。 |
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 |
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?<=pattern) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows "能匹配"2000Windows "中的"Windows ",但不能匹配"3.1Windows "中的"Windows "。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows "能匹配"3.1Windows "中的"Windows ",但不能匹配"2000Windows "中的"Windows "。 |
修饰符
也称之为标记符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外,格式如下:
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | global - 全局匹配 | 查找所有的匹配项。 |
m | multi line - 多行匹配 | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 . 中包含换行符 \n | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
通常都是在正则表达式最后,通过\i
,\g
, \m
,\s
\gm 等形式添加。
运算符优先级
我们在上面列了不少的符号,但是在实例中这些符号是有优先级的。
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
实例
上面介绍了各种符号,下面是通过实例进行使用。
下图是通过网络找到的一个详解图,大家配合介绍能够明白整个正则表达式的概念了。
示例集:
表达式 | 作用 |
---|---|
^(0|[1-9][0-9]*)$ | 适配:零和非零开头的数字 |
^[0-9]+(\.[0-9]{1,3})?$ | 适配:有1~3位小数的正数 |
^[\u4e00-\u9fa5]{0,}$ | 适配:有汉字 |
^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$ | 适配:邮箱地址 |
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.? | 适配:域名地址 |
^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ | 适配:手机号码(13,14,15,18开头的) |
^[a-zA-Z]\w{5,17}$ | 以字母开头,长度在6~18之间,只能包含字母、数字和下划线(可以用来限制自定义密码是否符合安全) |
评论区