正则表达式
MDNopen in new window菜鸟教程open in new window
正则表达式是国际标准,跨语言。
正则表达式是一个规则,用于验证字符串。
基础
- 字面量匹配
规则中直接书写字面量字符
- 特殊字符
.
匹配除换行符之外的任何单个字符。^
匹配输入的开始。$
匹配输入的结束。()
标记一个子表达式的开始和结束位置
- 转义符
\n
匹配一个换行符\r
不要使用,出现在 Windows 操作系统中。\t
匹配一个制表符\s
匹配一个空白字符,包括空格、制表符、换页符和换行符。\S
匹配一个非空白字符。\b
匹配一个单词的边界。\B
匹配一个非单词边界。\d
匹配一个数字。等价于[0-9]
。\D
匹配一个非数字字符。等价于[^0-9]
。\w
匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_]
。\W
匹配一个非单字字符。等价于[^A-Za-z0-9_]
。\uhhhh
匹配一个十六进制数表示的 Unicode 字符。h
表示一个十六进制的 Unicode 字符
转义符\
可以将特殊字符转义
- 字符集
[字符范围]
[^字符范围]
对字符范围取反
匹配中文:[\u4e00-\u9fa5]
- 量词
匹配前面一个表达式出现的次数
*
匹配前一个表达式 0 次或多次。等价于 {0,}。+
匹配前一个表达式 1 次或多次。等价于 {1,}。?
匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。{n}
匹配 n 个{n,}
匹配 >=n 个{n,m}
匹配 n~m 个
- 或者
多个规则之间适用,或者|
,表示多个规则任选其一。
JS 中的应用
JS 中,正则表达式表现为一个对象,是通过构造函数 RegExp 创建的
创建正则对象
字面量
由斜杠包围而不是引号包围。
/正则表达式/
构造函数模式
//以下三种表达式都会创建相同的正则表达式:
;/ab+c/i
new RegExp('ab+c', 'i')
new RegExp(/ab+c/, 'i')
2
3
4
静态属性
RegExp.lastIndex
该索引表示从哪里开始下一个匹配
实例属性
global
判断是否开启全局匹配,根据情况返回 true 或 false。
ignoreCase
是否忽略字符大小写。
multiline
是否开启多行模式匹配。
source
得到正则表达式的文本,不包括正则字面量两侧的斜杠与标志字符。
实例方法
test()
用来查看正则表达式与指定的字符串是否匹配,返回 true 或 false。
exec()
execute 的缩写,执行匹配,得到匹配的结果,返回一个结果数组或 null。
正则表达式,默认情况,使用贪婪模式(尽可能多匹配)
在量词后面,加上
?
,表示进入非贪婪模式。
字符串对象中的正则
match()
使用正则表达式与字符串相比较。
返回值:
- 如果使用 g 标志,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。
- 如果未使用 g 标志,则仅返回第一个完整匹配及其相关的捕获组(Array)。返回的数组有附加属性
- groups: 一个捕获组数组 或 undefined(如果没有定义命名捕获组)。
- index: 匹配的结果的开始位置
- input: 搜索的字符串.
search()
对正则表达式和指定字符串进行匹配搜索,返回第一个出现的匹配项的下标。
split()
使用指定的分隔符字符串将一个 String 对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。
语法:
str.split([separator[, limit]])
参数:
separator
指定表示每个拆分应发生的点的字符串。separator 可以是一个字符串或正则表达式。
limit
一个整数,限定返回的分割片段数量。
replace()
MDNopen in new window返回替换后的新字符串,原字符串不会改变。
语法:
str.replace(regexp | substr, newSubStr | function)
参数:
regexp (pattern)
一个 RegExp 对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉。
substr (pattern)
一个将被 newSubStr 替换的 字符串。其被视为一整个字符串,而不是一个正则表达式。仅第一个匹配项会被替换。
newSubStr (replacement)
用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。
function (replacement)
一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。
进阶
捕获组
用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中。
(正则表达式)
捕获组可以命名,叫做具名捕获组。在小括号前添加 ?<捕获组名字>
(?<捕获组名字>正则表达式)
非捕获组 在小括号前添加 ?:
(?:正则表达式)
反向引用
在正则表达式中,使用某个捕获组,\捕获组编号
正向断言(预查)
检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不成为捕获组。 (?=正则表达式)
正向断言(预查)
检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不成为捕获组。(?!正则表达式)