JavaScript中的RegExp正则表达式你知道多少?(建议收藏)
2023-12-28 11:12:05
RegExp
类型支持正则表达式。正则表达式使用类似
Perl
的简洁语法来创建:
let expression = /pattern/flags;
这个正则表达式的
pattern
(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、
分组、向前查找和反向引用。每个正则表达式可以带零个或多个
flags(标记),用于控制正则表达式的行为。下面给出了表示匹配模式的标记。
? g :全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。? i :不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。? m :多行模式,表示查找到一行文本末尾时会继续查找。? y :粘附模式,表示只查找从 lastIndex 开始及之后的字符串。? u : Unicode 模式,启用 Unicode 匹配。? s : dotAll 模式,表示元字符 . 匹配任何字符(包括 \n 或 \r )。
使用不同模式和标记可以创建出各种正则表达式,比如:
//
匹配字符串中的所有
"at"
let pattern1 = /at/g;
//
匹配第一个
"bat"
或
"cat"
,忽略大小写
let pattern2 = /[bc]at/i;
//
匹配所有以
"at"
结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
与其他语言中的正则表达式类似,所有
元字符
在模式中也必须转义,包括:
108
第
5
章 基本引用类型
( [ { \ ^ $ | ) ] } ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面这些字符本身,就必须使用反斜
杠来转义。下面是几个例子:
// 匹配第一个 "bat" 或 "cat" ,忽略大小写let pattern1 = /[bc]at/i;// 匹配第一个 "[bc]at" ,忽略大小写let pattern2 = /\[bc\]at/i;// 匹配所有以 "at" 结尾的三字符组合,忽略大小写let pattern3 = /.at/gi;// 匹配所有 ".at" ,忽略大小写let pattern4 = /\.at/gi;
这里的 pattern1
匹配
"bat"
或
"cat"
,不区分大小写。要直接匹配
"[bc]at"
,左右中括号都必
须像
pattern2
中那样使用反斜杠转义。在
pattern3
中,点号表示
"at"
前面的任意字符都可以匹配。
如果想匹配
".at"
,那么要像
pattern4
中那样对点号进行转义。
前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用
RegExp
构造函数来
创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可
以通过构造函数来创建,比如:
// 匹配第一个 "bat" 或 "cat" ,忽略大小写let pattern1 = /[bc]at/i;// 跟 pattern1 一样,只不过是用构造函数创建的let pattern2 = new RegExp("[bc]at", "i");
这里的
pattern1
和
pattern2
是等效的正则表达式。注意,
RegExp
构造函数的两个参数都是字
符串。因为
RegExp 的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转 义,包括转义字符序列,如
\n
(
\
转义后的字符串是
\\
,在正则表达式字符串中则要写成
\\\\)。下表 展示了几个正则表达式的字面量形式,以及使用
RegExp
构造函数创建时对应的模式字符串。
/\[bc\]at/????????????????????????? "\\[bc\\]at"/\.at/????????????????????????????????"\\.at"/name\/age/????????????????????"name\\/age"/\d.\d{1,2}/???????????????????????"\\d.\\d{1,2}"/\w\\hello\\123/????????????????"\\w\\\\hello\\\\123"
此外,使用
RegExp
也可以基于已有的正则表达式实例,并可选择性地修改它们的标记:
const re1 = /cat/g;console.log(re1); // "/cat/g"const re2 = new RegExp(re1);console.log(re2); // "/cat/g"const re3 = new RegExp(re1, "i");console.log(re3); // "/cat/i"
RegExp 实例属性
每个
RegExp
实例都有下列属性,提供有关模式的各方面信息。
-? global :布尔值,表示是否设置了 g 标记。-? ignoreCase :布尔值,表示是否设置了 i 标记。-? unicode :布尔值,表示是否设置了 u 标记。-? sticky :布尔值,表示是否设置了 y 标记。-? lastIndex :整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。-? multiline :布尔值,表示是否设置了 m 标记。-? dotAll :布尔值,表示是否设置了 s 标记。-? source :正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。-? flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没 有前后斜杠)。
通过这些属性可以全面了解正则表达式的信息,不过实际开发中用得并不多,因为模式声明中包含
这些信息。下面是一个例子:
let pattern1 = /\[bc\]at/i;console.log(pattern1.global); // falseconsole.log(pattern1.ignoreCase); // trueconsole.log(pattern1.multiline); // falseconsole.log(pattern1.lastIndex); // 0console.log(pattern1.source); // "\[bc\]at"console.log(pattern1.flags); // "i"let pattern2 = new RegExp("\\[bc\\]at", "i");console.log(pattern2.global); // falseconsole.log(pattern2.ignoreCase); // trueconsole.log(pattern2.multiline); // falseconsole.log(pattern2.lastIndex); // 0console.log(pattern2.source); // "\[bc\]at"console.log(pattern2.flags); // "i"
注意,虽然第一个模式是通过字面量创建的,第二个模式是通过
RegExp
构造函数创建的,但两个
模式的
source
和
flags
属性是相同的。
source
和
flags
属性返回的是规范化之后可以在字面量中
使用的形式。
RegExp 构造函数属性
RegExp
构造函数本身也有几个属性。(在其他语言中,这种属性被称为静态属性。)这些属性适用
于作用域中的所有正则表达式,而且会根据最后执行的正则表达式操作而变化。这些属性还有一个特点,
112
第
5
章 基本引用类型
就是可以通过两种不同的方式访问它们。换句话说,每个属性都有一个全名和一个简写。下表列出了
RegExp
构造函数的属性
input???????????????????????? $_????????????????????????最后搜索的字符串(非标准特性)lastMatch???????????????? $&????????????????????????最后匹配的文本lastParen???????????????? $+????????????????????????最后匹配的捕获组(非标准特性)leftContext???????????????$`?????????????????????????input 字符串中出现在 lastMatch 前面的文本rightContext?????????????$'? ? ? ? ? ? ? ? ? ? ? ? ? nput 字符串中出现在 lastMatch 后面的文本
通过这些属性可以提取出与 exec()和 test()执行的操作相关的信息。来看下面的例子:
let text = "this has been a short summer";let pattern = /(.)hort/g;if (pattern.test(text)) {????????console.log(RegExp.input); // this has been a short summer????????console.log(RegExp.leftContext); // this has been a????????console.log(RegExp.rightContext); // summer????????console.log(RegExp.lastMatch); // short????????console.log(RegExp.lastParen); // s}
以上代码创建了一个模式,用于搜索任何后跟
"hort"
的字符,并把第一个字符放在了捕获组中。
不同属性包含的内容如下。
?
input
属性中包含原始的字符串。
?
leftConext
属性包含原始字符串中
"short"
之前的内容,
rightContext
属性包含
"short"
之后的内容。
?
lastMatch
属性包含匹配整个正则表达式的上一个字符串,即
"short"
。
?
lastParen
属性包含捕获组的上一次匹配,即
"s"
。
这些属性名也可以替换成简写形式,只不过要使用中括号语法来访问,如下面的例子所示,因为大
多数简写形式都不是合法的
ECMAScript
标识符:
let text = "this has been a short summer";let pattern = /(.)hort/g;/** 注意: Opera 不支持简写属性名* IE 不支持多行匹配*/if (pattern.test(text)) {????????console.log(RegExp.$_); // this has been a short summer????????console.log(RegExp["$`"]); // this has been a????????console.log(RegExp["$'"]); // summer????????console.log(RegExp["$&"]); // short????????console.log(RegExp["$+"]); // s}
RegExp
还有其他几个构造函数属性,可以存储最多
9
个捕获组的匹配项。这些属性通过
RegExp.
$1
~
RegExp.$9
来访问,分别包含第
1~9
个捕获组的匹配项。在调用
exec()
或
test()
时,这些属属
就会被填充,然后就可以像下面这样使用它们:
let text = "this has been a short summer";let pattern = /(..)or(.)/g;if (pattern.test(text)) {????????console.log(RegExp.$1); // sh????????console.log(RegExp.$2); // t}
????????在这个例子中,模式包含两个捕获组。调用 test()
搜索字符串之后,因为找到了匹配项所以返回
true
,而且可以打印出通过
RegExp
构造函数的
$1
和
$2
属性取得的两个捕获组匹配的内容。
文章来源:https://blog.csdn.net/m0_73358221/article/details/135254611
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!