正则表达式
前期准备
在线正则测试工具: https://c.runoob.com/front-end/854/
一、 语法
正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查是否含有某种子串、将匹配的子串替换或者从某个串中去除符合某个条件的子串等。
例如:
ro+b
,可以匹配roob、rooob等,+
号表示前面的字符必须至少出现一次(1次或多次)。ro*b
,可以匹配rob、roob等,*
号表示前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)ro?b
可以匹配rob、roob,?
号表示前面的字符最多只能出现一次(0次或1次)
构造正则表达式的方法喝创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起创建出更大的表达式。而本文则主要告诉我们这些小的表达式该如何使用
普通字符
[ABC]
匹配[…]中的所有字符,例如[asp]
匹配字符串super
中的所有的a
,s
、p
字符。
[^ABC]
匹配除了[…]中的所有字符,(不在[]
中含义将不同)
[A-Z]
[A-Z]
表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母。
.
匹配除了换行符(\n, \r)之外的任何单个字符,等价于[^\n\r]
[\s\S]
匹配所有。\s是匹配所有空白符,包括换行,\S非空白符,不包括换行。
\w
匹配字母、数字、下划线。等价于[A-Za-z0-9]
二、修饰符
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不卸载正则表达式里,标记位于表达式外,格式如下:
/pattern/flags
正则表达式常用修饰符:
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore-不考虑大小写 | 将匹配和搜索设置为不区分大小写 |
g | global-全局匹配 | 查找所有的匹配项 |
m | multi line- 多行匹配 | 使边界字符^ 和$ 匹配每一行的开头和结尾 |
s | 特殊字符圆点. 中包含换行符\n | 默认情况下的圆点. 是匹配除换行符\n 之外的任何字符,加上s 修饰符之后,. 中包含换行符\n |
三、元字符
这个网上有很多表格了,下面给出一个元字符表格的链接元字符表。
四、运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序。
相同优先级的从左到右进行计算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (?😃, (?=), [] | – |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和顺序 |
| | 替换,"或"操作 |
五、匹配规则
基本匹配模式
模式是正则表达式最基本的元素,它们是一组描述字符串特征的字符。例如:
^hi
这个模式包含一个特殊的字符^
,表示该模式只能匹配那些以hi开头的字符串。与^
类似,$
符号用来匹配那些以给定模式结尾的字符串。
bucket$
这个模式与"Who kept all of this cash in a bucket"匹配。字符^
和$
同时使用时,表示精准匹配,例如:
^bucket$
只匹配字符串"bucket"。如果.一个模式不包括^
和$
,那么它与任何包含该模式的字符串匹配。
在该模式中,若要表示其他一些稍微复杂的字符,如标点符号和白字符,要用到准一序列。所有的转义序列都用反斜杠\
打头.制表符的转义序列时\t
。
类似的,我们用\n
表示新行,\r
表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\
表示,句号.
用\.
表示,以此类推。
字符簇
在面对检验用户输入这样比较复杂的场景时,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式方法,就是字符簇,就把所有的元音字符放在一个方括号里面:
[AaBsda]
例如:
^[a-z][0-9]$
表示匹配第一个字符是小写字母第二个为数字的字符串。
确定重复出现
基于前面提到的两种匹配规则我们已经可以面对很多的场景了。但是在一些情况下我们需要匹配一个单词或一组数字,跟在字符或字符簇后面的画括号({})用来确定前面的内容的重复出现的次数。例如
字符簇 | 描述 |
---|---|
^a$ | 字符a |
^a{2,4}$ | aa,aaa,aaaa |
^a{2,}$ | 包含多于两个a的字符串 |
.{2} | 所有的两个字符 |
\t{2} | 两个制表符 |
上面的例子中描述了花括号的三种不同用法。这个跟很多的高级语言的切片类似。我们可以将模式扩展到更多的单词或数字:
^[a-zA-Z0-9_]{1,}$ // 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]{0,}$ // 所有的正整数
^\-{0,1}[0-9]{1,}$ // 所有的整数
^[-]?[0-9]+\.?[0-9]+$ // 所有的浮点数
上面的例子中表示所有浮点数的字符簇比较难理解,其实字符?
与{0,1}
是等价的。所以刚刚的例子可以简化为:
^\-?[0-9]{1,}\.?[0-9]{1,}$
特殊字符*
与{0,}
是相等的,它们都代表着 0个或多个前面的内容.最后字符+
和{1,}
是相等的,表示 1个或多个前面的内容,所以上面的4个例子可以写成:
^[a-zA-Z0-9_]+$ // 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]*$ // 所有的正整数
^\-?[0-9]+$ // 所有的整数
^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮点数