正则学习

333 阅读3分钟

正则(RegExp)

  正则表达式是一种用于匹配字符串或特殊字符的一种逻辑公式,所谓逻辑公式就是由一些特定字符组合成的,用来表示某些规则的特殊字符串,可以表达对字符串数据的过滤逻辑。

1.创建正则的方式

var patt = new RegExp(pattern,modifiers) 
var patt = /pattern/modifiers
参数说明如下:
pattern:正则表达式,按照正则表达式的语法定义的正则表达式;
modifiers:修饰符,用来设置字符串的匹配模式,可选值如下表所示:

1.1 定义正则表达式

正则表达式由字母、数字、标点以及一些特殊特殊字符组成,例如/abc//(\d+)\.\d*/,可以在正则表达式中使用的特殊字符如下表所示:

特殊字符含义类型
.匹配除换行符之外的任何单个字符。例如“/.n/”将会匹配“nay, an apple is on the tree”中的“an”和“on”。元字符
\w匹配一个单字字符(字母、数字或者下划线),等价于“[A-Za-z0-9_]”。例如“/\w/”能够匹配“apple,”中的“a”,“$5.28,”中的“5”和“3D.”中的“3”。元字符
\W匹配一个非单字字符,等价于“[^A-Za-z0-9_]”。例如“/\W/”或者“/[^A-Za-z0-9_]/”能够匹配“50%.”中的“%”。元字符
\d匹配一个数字,等价于“[0-9]”。例如“/\d/”或者“/[0-9]/”能够匹配“B2 is the suite number.”中的“2”。元字符
\D匹配一个非数字字符,等价于“[^0-9]”。 例如“/\D/”或者“/[^0-9]/”能够匹配“B2 is the suite number.”中的“B”。元字符
\s匹配一个空白字符,包括空格、制表符、换页符和换行符,等价于“[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]”。例如“/\s\w*/”能够匹配“foo bar.”中的“bar”。元字符
\S匹配一个非空白字符,等价于“[^\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]”。例如“/\S\w*/”能够匹配“foo bar.”中的“foo”。元字符
\b匹配一个单词的边界,即单词的开始或末尾。例如“/\bm/”能够匹配“moom”中的“m” 只是第一个m,但不会匹配“imoon”中的“m”。 /m\b/ moom 匹配最后一个m元字符
\B匹配一个非边界的单词。例如“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 同上元字符
\0匹配 NULL(U+0000)字符,不要在这后面跟其它小数,因为 \0 是一个八进制转义序列。元字符
\n匹配一个换行符 (U+000A)。元字符
\f匹配一个换页符 (U+000C)。元字符
\r匹配一个回车符 (U+000D)。元字符
\t匹配一个水平制表符 (U+0009)。元字符
\xxx查找以八进制数 xxxx 规定的字符元字符
\xhh匹配一个两位十六进制数(\x00-\xFF)表示的字符。元字符
\uhhhh匹配一个四位十六进制数表示的 UTF-16 代码单元。元字符
\xdd查找以十六进制数 dd 规定的字符元字符
\u{hhhh}或\u{hhhhh}仅在设置了修饰符 u 时)匹配一个十六进制数表示的 Unicode 字符。元字符
[ xyz ]转义序列,匹配 x、y 或 z,您也可以使用破折号-来指定一个字符范围。例如“[abcd]”和“[a-d]”是一样的,它们都能匹配“brisket”中的“b”,“city”中的“c”。描述字符范围
[ ^xyz ]反向字符集,匹配除 x、y、z 以外的任何字符,您通用也可以使用破折号-来指定一个字符范围。例如“[^abc]”和“[^a-c]”是一样的,它们都能匹配“brisket”中的“r”,“chop”中的“h”。描述字符范围
xy匹配“x”或者“y”。 例如“/green
+匹配前面一个表达式 1 次或者多次,等价于 {1,}。例如“/a+/”能够匹配“candy”中的“a”和“caaaaaaandy”中所有的“a”,但是在“cndy”中不会匹配任何内容。重复匹配
*匹配前一个表达式 0 次或多次,等价于 {0,}。例如“/bo*/”能够匹配“A ghost boooooed”中的“booooo”和“A bird warbled”中的“b”,但是在“A goat grunted”中不会匹配任何内容。重复匹配
?匹配前面一个表达式 0 次或者 1 次,等价于 {0,1}。例如“/e?le?/”能够匹配“angel”中的“el”,“angle”中的“le”以及“oslo”中的“l”。重复匹配
{ n }n 是一个正整数,表示匹配前一个字符 n 次。例如“/a{2}/”不会匹配“candy”中的“a”,但是能够匹配“caandy”中所有的“a”,以及“caaandy”中的前两个“a”。重复匹配
{ n , m }n 和 m 都是整数,表示匹配前一个字符至少 n 次,最多 m 次,如果 n 或 m 等于 0,则表示忽略这个值。例如“/a{1, 3}/”能够匹配“candy”中的“a”,“caandy”中的前两个“a”,“caaaaaaandy”中的前三个“a”。重复匹配
{ n , }n 是一个正整数,表示匹配前一个字符至少 n 次。例如“/a{2,}/”能够匹配“aa”、“aaaa”或“aaaaa”,但不会匹配“a”。重复匹配
匹配字符串的开头,如果设置了修饰符 m,则也可以匹配换行符后紧跟的位置。 例如“/^A/”并不会匹配“an A”中的“A”,但是会匹配“An E”中的“A”。边界量词
$匹配字符串的末尾,如果设置了修饰符 m,则也可以匹配换行符之前的位置。 例如“/t$/”并不会匹配“eater”中的“t”,但是会匹配“eat”中的“t”。边界量词
( x )匹配“x”并记住这一匹配项,这里的括号被称为捕获括号。子表达式
( ?: x )匹配“x”但是不记住匹配项,这里的括号被称为非捕获括号。禁止引用
x( ?= y )当“x”后面跟着“y”时,匹配其中的“x”。例如“/Jack(?=Sprat)/”会匹配后面跟着“Sprat”的“Jack”,“/Jack(?=SpratFrost)/”会匹配后面跟着“Sprat”或者是“Frost”的“Jack”。注意:无论是“Sprat”还是“Frost”都不是匹配结果的一部分。
( ?<= y ) x当“x”前面是“y”时,匹配其中的“x”。例如“/(?<=Jack)Sprat/”会匹配前面未“Sprat”的“Jack”,“/(?<=JackTom)Sprat/”会匹配前面为“Jack”或者“Tom”的“Sprat”。注意:无论是“Jack”和“Tom”都不是匹配结果的一部分。
x ( ?! y )当“x”后面不是“y”时,匹配其中的“x”。 例如“/\d+(?!.)/”会匹配“3.141”中的“141”,而不是“3.141”。声明词量
( ?< ! y )x当“x”前面不是“y”时,匹配其中的“x”。声明词量
\n ( n 是数字 )获取最后的第 n 个匹配的值。比如“/apple(,)\sorange\1/”能够匹配“apple, orange, cherry, peach.”中的“apple, orange,”。反向引用
[\b]匹配一个退格符,注意:不要和 \b 混淆。
\转义字符,在非特殊字符之前使用反斜杠表示下一个字符是特殊字符,不能按照字面理解,例如\b表示一个字符边界;在特殊字符之前使用反斜杠则表示下一个字符不是特殊字符,应该按照字面理解。例如反斜杠本身,若要在正则表达式中定义一个反斜杠,则需要在反斜杠前再添加一个反斜杠\。
\c X当 X 是 A 到 Z 之间的字符时,匹配字符串中的一个控制符。例如“/\cM/”能够匹配字符串中的“control-M(U+000D)”。
\v匹配一个垂直制表符 (U+000B)。
⚠️ 提示:在正则表达式中`.` 、`*` 、`?` 、`+` 、`[` 、`]` 、`(` 、`)` 、`{` 、`}` 、`^` 、`$` 、`|` 、`\` 等字符被赋予了特殊的含义,若要在正则表达式中使用这些字符的原本意思时,需要在这些字符前添加反斜线进行转义,例如若要匹配`.`,则必须编写为`\.`。

1.2 修饰符

修饰符描述
i (case insensitive)执行对大小写不敏感的匹配
g (global)执行全局匹配(查找所有的匹配项,而非在找到第一个匹配项后停止)
m (multiline)执行多行匹配
s (single line)允许使用.匹配换行符
u (unicode)使用 Unicode 码的模式进行匹配
y (sticky)执行“粘性”搜索,匹配从目标字符串的当前位置开始
⚠️ 注意:当使用 new 关键字创建 RegExp 对象时,需要将正则表达式中的特殊字符转义,即在特殊字符前加反斜杠`\`,例如`\\w+`

1.3 使用正则表达式

方法描述
exec()在字符串搜索匹配项,并返回一个数组,若没有匹配项则返回 null
test()测试字符串是否与正则表达式匹配,匹配则返回 true,不匹配则返回 false
toString()返回表示指定对象的字符串
属性描述
constructor返回一个函数,该函数是一个创建 RegExp 对象的原型
global判断是否设置了修饰符 "g"
ignoreCase判断是否设置了修饰符 "i"
lastIndex用于规定下次匹配的起始位置
multiline判断是否设置了修饰符 "m"
source返回正则表达式的匹配模式

1.4 字符串正则方法

方法描述
search()在字符串中搜索匹配项,并返回第一个匹配的结果,若没有找到匹配项则返回 -1
match()在字符串搜索匹配项,并返回一个数组,若没有匹配项则返回 null
matchAll()在字符串搜索所有匹配项,并返回一个迭代器(iterator)
replace()替换字符串中与正则表达式相匹配的部分
split()按照正则表达式将字符串拆分为一个字符串数组