JavaScript (十) 正则表达式
正则表达式(Regular Expression) 由具有特定规则的字符组合而成(规则字符串),用来描述一系列符合该规则的字符串的筛选逻辑
RegExp 对象
RegExp 对象是 js 的内置对象,用于将文本与一个模式匹配
1.使用 正则表达式字面量 来创建一个RegExp类型对象
语法:
1 | var reg = /模式/选项 |
2.使用 构造函数 来创建一个RegExp类型对象
语法:
1 | var reg = new RegExp(模式, 选项) |
属性:
global
判断是否设置了 “g” 选项(true / false)ignoreCase
判断是否设置了 “i” 选项(true / false)multiline
判断是否设置了 “m” 选项(true / false)dotAll
判断是否设置了 “s” 选项(true / false)lastIndex
用于规定下次匹配的起始位置(索引),该属性的值需要正则表达式设置了 g 选项才有效,否则该值一直为 0source
返回正则表达式模式(一个字符串)flags
返回正则表达式选项(一个字符串)
方法:
exec()
在输入字符串中搜索一个匹配的字符串,搜索到则返回一个结果数组语法:
1
2
3
4
5
6
7
8
9
10
11正则表达式.exec(输入字符串)
/*
返回值:结果数组
- [下标]: 索引0为匹配结果字符串,索引1-任意数字为被捕获的字符串
- input: 输入字符串
- index: 匹配结果在输入字符串中的位置(索引)
- groups: 捕获命名组对象
如果正则表达式设置了 g 选项,则会根据RegExp类型对象中的lastIndex属性值,来决定下一次匹配的位置,
即在下1次调用该方法时,返回下1个匹配结果及其相关属性和捕获组,直到最后一个结果为止
如果正则表达式没设置 g 选项,则会在每次调用时都返回第1个匹配结果及其相关属性和捕获组
*/test()
检测正则表达式与输入字符串是否匹配,匹配则返回 true,不匹配则返回 false语法:
1
正则表达式.test(输入字符串)
例:
1 | const str = 'table football'; |
正则表达式模式(RegexPattern)
正则表达式模式可以使用任何普通字符串进行匹配,如:abc、123
正则表达式模式还可以使用一些具有特殊意义的字符(元字符)进行匹配,如:[A-z]、{4,8}
字符类
描述:与一组字符中的任何一个字符匹配
字符类 | 描述 | 模式 | 匹配 |
---|---|---|---|
[字符组] | 匹配 字符组 中的任何单一字符 | [abc] | "rgba" 匹配结果:"b" 、"a" |
[^字符组] | 求反:匹配不在 字符组 中的任何字符 | [^aei] | "reign" 匹配结果:"r" 、"g" 和 "n" |
[first-last] | 字符范围:匹配从第一个至最后一个的范围内的任何字符 | [A-Z] | "AB123" 匹配结果:"A" 和 "B" |
. | 通配符:匹配除 \n (换行符) 之外的任何字符 | a.e | "water" 匹配结果:"ate" |
\w | 匹配任何 单词字符(字母 数字 _) | \w | "ID A1.3" 匹配结果:"I" 、"D" 、"A" 、"1" 和 "3" |
\W | 匹配任何 非单词字符(非字母 数字 _) | \W | "ID A1.3" 匹配结果:" " 和 . |
\s | 匹配任何 空白字符(空格 换行) | \w\s | "ID A1.3" 匹配结果:"D " |
\S | 匹配任何 非空白字符(非空格 换行) | \s\S | "int val" 匹配结果:" v" |
\d | 匹配任何 十进制数字字符 | \d | "4 = IV" 匹配结果:"4" |
\D | 匹配任何 非十进制数字字符 | \D | "4 = IV" 匹配结果: " " 、"=" 、" " 、"I" 和 "V" |
量词
描述:上一个元素(字符、分组或字符类)必须出现指定次数才能匹配
量词(限定符) | 描述 | 模式 | 匹配 |
---|---|---|---|
* | 上一个元素必须出现0次或多次 | a.*c | "abcbc" 匹配结果:"abcbc" |
+ | 上一个元素必须出现1次或多次 | "be+" | "been" 匹配结果:"bee" |
? | 上一个元素必须出现0次或1次 | "rai?" | "rain" 匹配结果:"rai" |
{n} | 上一个元素必须出现 n 次 | ",\d{3}" | "1,043.6" 匹配结果:",043" |
{n,} | 上一个元素必须出现 n 次以上 | "\d{2,}" | "166" , "29" , "1930" |
{n,m} | 上一个元素必须出现 n 到 m 次 | "\d{3,5}" | "166" , "17668" |
*? | 惰性匹配:上一个元素必须出现0次或多次,但次数尽可能少 | a.*?c | "abcbc" 匹配结果:"abc" |
+? | 惰性匹配:上一个元素必须出现1次或多次,但次数尽可能少 | "be+?" | "been" 匹配结果:"be" |
?? | 惰性匹配:上一个元素必须出现0次或1次,但次数尽可能少 | "rai??" | "rain" 匹配结果:"ra" |
{n,}? | 惰性匹配:上一个元素必须出现 n 次以上,但次数尽可能少 | "\d{2,}?" | "166" , "29" , "1930" |
{n,m}? | 惰性匹配:上一个元素必须出现 n 到 m 次,但次数尽可能少 | "\d{3,5}?" | "193024" 匹配结果:"193" 和 "024" |
定位点
描述:指定的字符串必须出现在匹配的位置
定位点 | 描述 | 模式 | 匹配 |
---|---|---|---|
^ | 匹配必须出现在输入字符串的开头,在多行模式下,匹配必须出现在输入字符串中所在行的开头 | ^\d{3} | "901-333-" 匹配结果:"901" |
$ | 匹配必须出现在输入字符串的末尾,在多行模式下,匹配必须出现在输入字符串中所在行的末尾 | -\d{3}$ | "-901-333" 匹配结果:"-333" |
\b | 匹配必须出现在 \w (单词)和 \W (非单词)字符之间的边界上 | \b\w+\s\w+\b | "them theme them them" 匹配结果:"them theme" 和 "them them" |
\B | 匹配不得出现在 \b 边界上 | \Bend\w*\b | "end sends endure lender" 匹配结果:"ends" 和 "ender" |
分组
描述:将组中匹配的文本作为一个整体处理
分组 | 描述 | 模式 | 匹配 |
---|---|---|---|
(子表达式) | 捕获组:捕获匹配的子表达式(任何正则表达式)并将其分配到一个从 1 开始的序号中 | (\w)\1 | "deep" 匹配结果:"ee" |
` | ` | 或运算符:匹配以竖线 (` | `) 字符分隔的任何一个元素 |
\数字 | 反向引用:在同一正则表达式中引用捕获组中匹配的字符串 | (\w)\1 | "deep" 匹配结果:"ee" |
(?< 名称>子表达式) 或 (?' 名称'子表达式) | 捕获命名组:将匹配的子表达式捕获到一个命名组中 | (?<double>\w)\k<double> | "deep" 匹配结果:"ee" |
(?:子表达式) | 非捕获组 | Write(?:Line)? | "WriteLine()" 匹配结果:"WriteLine" |
(?=子表达式) | 向前断言(非捕获):上一个元素必须跟随在子表达式匹配的前面,子表达式不会作为匹配结果 | \b\w+\b(?=.+and.+) | "cats, dogs and some mice." 匹配结果:"cats" , "dogs" |
(?!子表达式) | 向前否定断言(非捕获):上一个元素不能跟随在子表达式匹配的前面,子表达式不会作为匹配结果 | \b\w+\b(?!.+and.+) | "cats, dogs and some mice." 匹配结果:"and" , "some" , "mice" |
(?<=子表达式) | 向后断言(非捕获):上一个元素必须跟随在子表达式匹配的后面,子表达式不会作为匹配结果 | \b\w+\b(?<=.+and.+) | "cats, dogs and some mice." 匹配结果:"some" , "mice" |
(?<!子表达式) | 向后否定断言(非捕获):上一个元素不能跟随在子表达式匹配的后面,子表达式不会作为匹配结果 | \b\w+\b(?<!.+and.+) | "cats, dogs and some mice." 匹配结果:"cats" , "dogs" , "and" |
替代属性 ( 静态 )
说明:非标准属性,但大部分浏览器都进行了实现
替代属性 | 描述 |
---|---|
RegExp.$1-$9 | 含有分组中指定位置的字符串,可以在 String.replace 方法进行分组位置替换 |
RegExp.input ($_) | 含有正则表达式所匹配的字符串 |
RegExp.lastMatch ($&) | 含有正则表达式最后匹配到的字符串 |
RegExp.lastParen ($+) | 含有最后一个分组匹配到的内容 |
RegExp.leftContext ($`) | 含有最新匹配的左侧字符串 |
RegExp.rightContext ($’) | 含有最新匹配的右侧字符串 |
例:
1 | /* 例1 */ |
贪婪匹配与惰性匹配
在使用 *
、+
、{n,}
、{n,m}
等量词进行匹配时,默认会匹配尽可能多的字符(贪婪匹配),如果在这些量词后面后加一个 ?
,就会匹配尽可能少的字符(惰性匹配)
捕获
捕获是将正则表达式匹配到的字符串暂存起来,其中多个捕获组捕获的字符串会从1开始编号,\1表示第一个被捕获的字符串,\2是第二个,以此类推…
嵌套组
括号可以嵌套使用,这种情况下,编号从左向右,从外向内
例:
1 | let str = '<span class="my">'; |
正则表达式选项(RegexOption)
i
匹配时不区分字母大小写g
全局(global)搜索,匹配时会查找输入字符串中的所有匹配结果,默认情况会在找到第一个匹配后停止m
多行(multiline)模式,在使用^
、$
进行位置匹配时,默认会匹配整个字符串的开头或结束位置(忽略换行),设置该选项后,则会匹配字符串中每一行的开头或结束位置s
dotall模式,允许点.
匹配换行符\n
支持正则表达式的 String 对象方法
match()
查找一个或多个正则表达式的匹配,并返回一个结果数组
语法:
1 | 字符串.match(正则表达式) |
search()
搜索与正则表达式相匹配的值,并返回该值所在位置(索引)
语法:
1 | 字符串.search(正则表达式) |
replace()
将字符串中指定内容替换为新的内容,并返回替换后内容
语法:
1 | 字符串.replace(正则表达式|替换字符串, 被替换内容) |
split()
将字符串拆分成数组并返回
语法:
1 | 字符串.split(分割字符串|正则表达式) |
正则表达式在线测试工具:https://regex101.com
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Timeicの博客!
评论