JavaScript 正则表达式
前言
本篇文章是一篇MDN正则表达式学习笔记,用于复习。
如果笔记总结有错,请各位大佬指出,避免误导更多人。
1. 创建一个正则表达式
(1)使用一个正则表达式字面量,其由包含在斜杠之间
的模式组成,如下所示:
var re = /abc/;
脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可获得更好的性能。
反斜杠之间不能识别变量,不会被识别。
var u='abc'
var re = /u/; // 得到的还是u,而不是abc
这时可以使用模板字符串以及eval()
函数
var u='abc'
// eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
var re = eval(`/${u}/`)
(2)或者调用RegExp
对象的构造函数,如下所示:
var re= new RegExp('abc')
在脚本运行过程中,用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。
与字面量创建不同,构造函数可以识别变量
var u='abc'
var re= new RegExp(u)
2. RegExp 修饰符
i -
修饰符是用来执行不区分大小写的匹配。
var re1=/abc/i;
var re2=/abc/
var a='wtjsosjaBc'
console.log(re1.test(a)); //true
console.log(re2.test(a)); //false
g -
修饰符是用于执行全文的搜索(而不是在找到第一个就停止查找,而是找到所有的匹配)。
var str="Is this all there is?";
var re1=/is/g;
var re2=/is/;
console.log(str.match(re1)); //[ 'is', 'is' ]
console.log(str.match(re2)); //[ 'is', index: 5, input: 'Is this all there is?', groups: undefined ]
除此之外,还有
3. RegExp.lastIndex
lastIndex
是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。只有正则表达式使用了表示全局检索的"g"
标志时,该属性才会起作用。
4. RegExp原型上的方法
test()
test()
方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。
var re = /abc/;
var a='wtjsosjabc'
var b='wtjsosjab'
console.log(re.test(a)); //true
console.log(re.test(b)); //false
exec()
exec()
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
如果匹配成功,exec() 方法返回一个数组(包含额外的属性 index 和 input ,参见下方表格),并更新正则表达式对象的 lastIndex 属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。
如果匹配失败,exec() 方法返回 null,并将 lastIndex 重置为 0 。
const regex1 = RegExp('foo*', 'g');
const str1 = 'table football, foosball';
let array1;
while ((array1 = regex1.exec(str1)) !== null) {
console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
// expected output: "Found foo. Next starts at 9."
// expected output: "Found foo. Next starts at 19."
}
5. String原型上的方法
match()
match() 方法检索返回一个字符串匹配正则表达式的结果。
如果使用g标志,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。
如果未使用g标志,则仅返回第一个完整匹配及其相关的捕获组(Array)。 在这种情况下,返回的项目将具有如下所述的其他属性。
var str="Is this all there is?";
var re1=/is/g;
var re2=/is/;
console.log(str.match(re1)); //[ 'is', 'is' ]
console.log(str.match(re2)); //[ 'is', index: 5, input: 'Is this all there is?', groups: undefined ]
matchAll()
matchAll() 方法返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器, RegExp
必须是设置了全局模式g的形式,否则会抛出异常TypeError。
语法:
str.matchAll(regexp)
使用:
var str="Is this all there is?";
var re1=/is/g;
const arr =str.matchAll(re1)
for(const i of arr ){
console.log(i);
}
运行结果
search()
search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。如果匹配成功,则 search() 返回正则表达式在字符串中首次匹配项的索引;否则,返回 -1。
var str="Is this all there is?";
var re1=/is/;
var re2=/ish/;
console.log(str.search(re1)); //5
console.log(str.search(re2)); //-1
6. 正则表达式中的特殊字符
字符 | 含义 |
---|---|
\ | 转义符 |
^ | 匹配输入的开始。/^ A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。当 '^' 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。 |
$ | 匹配输入的结束。例如,/t$/ 并不会匹配 “eater” 中的 ‘t’,但是会匹配 “eat” 中的 ‘t’。 |
* | 匹配前一个表达式 0 次或多次。等价于 {0,}。 |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,}。 |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。 |
. | (小数点)默认匹配除换行符之外的任何单个字符。例如,/.n/ 将会匹配 “nay, an apple is on the tree” 中的 ‘an’ 和 ‘on’,但是不会匹配 ‘nay’。 |
字符 | 含义 |
---|---|
x(?=y) | 匹配’x’仅仅当’x’后面跟着’y’.这种叫做先行断言。 |
(?<=y)x | 匹配’x’仅当’x’前面是’y’.这种叫做后行断言。 |
x(?!y) | 仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找。 |
(?<!y)x | 仅仅当’x’前面不是’y’时匹配’x’,这被称为反向否定查找。 |
`x | y` |
字符 | 含义 |
---|---|
{n} | n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。 /a{2}/ 不会匹配“candy”中的’a’,但是会匹配“caandy”中所有的 a |
{n,} | n是一个正整数,匹配前一个字符至少出现了n次。 |
{n,m} | n 和 m 都是整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。 |
[xyz] | 一个字符集合。可以使用破折号(-)来指定一个字符范围。 |
[^xyz] | 一个反向字符集 |
字符 | 含义 |
---|---|
\d | 匹配一个数字。等价于[0-9] 。 |
\D | 匹配一个非数字字符。等价于[^0-9] 。 |
\w | 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]。 |
\W | 匹配一个非单字字符。等价于 [^A-Za-z0-9_]。 |
\n | 匹配一个换行符 (U+000A)。 |
\r | 匹配一个回车符 (U+000D)。 |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符。例如,/\s\w*/ 匹配"foo bar."中的’ bar’。 |
\S | 匹配一个非空白字符。例如,/\S\w*/ 匹配"foo bar."中的’foo’。 |
\0 | 匹配 NULL(U+0000)字符, 不要在这后面跟其它小数 |
字符 | 含义 |
---|---|
\xhh | 匹配一个两位十六进制数(\x00-\xFF)表示的字符。 |
\uhhhh | 匹配一个四位十六进制数表示的 UTF-16 代码单元。 |
\u{hhhh}或\u{hhhhh} | (仅当设置了u标志时)匹配一个十六进制数表示的 Unicode 字符。 |
如果读完觉得还不错,记得点赞、收藏!