javaScript之正则表达式对象
1. 简介
正则表达式(Regular Expression),又称规则表达式,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
javaScript中使用RegExp对象提供正则表达式的功能。
创建正则表达式有两种方式:
- 使用直接量
- 使用构造函数
// 使用直接量创建正则表达式,以"/"表示开始和结束
var regexp1 = /abc/;
// 使用构造函数创建正则表达式
var regexp2 = new RegExp("abc");
上面两种写法都创建了一个内容为abc的正则表达式对象。但是通过直接量创建的正则表达式对象在javaScript引擎编译的时候就已经创建了,而通过构造函数创建的正则表达式对象是在运行时才创建的。RegExp构造函数还可以接受第二个参数,表示修饰符。
var regexp3 = new RegExp("abc","im");
// 两者等价
var regexp4 = /abc/im;
2. RegExp实例对象属性和方法
2.1 实例对象属性
正则表达式对象的实例属性分为两类:
- 与修饰符相关的属性
ignoreCase:返回布尔值,表示是否设置了i修饰符,只读。global:返回布尔值,表示是否设置了g修饰符,只读。multiline:返回布尔值,表示是否设置了m修饰符,只读。flags:返回字符串,包含了已经设置了的修饰符,只读。
- 与修饰符无关的属性
lastIndex:返回一个整数,表示下一次搜索开始的位置,可读写。source:返回正则表达式的字符串形式,只读。
var regexp5 = /test/igm;
// 与修饰符相关的属性(只读)
regexp5.ignoreCase; // true
regexp5.global; // true
regexp5.multiline; // true
regexp5.flags; // “gim”
// 与修饰符无关的属性
regexp5.lastIndex; // 0
regexp5.source; // “test”
2.2 实例对象方法
2.2.1 RegExp.prototype.test()
RegExp实例对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。
如果RegExp实例对象带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。
var regexp6 = /Hello/;
regexp6.test("Hello World!"); // true
// 带有g修饰符的正则表达式对象
var regexp7 = /m/g;
var t = "m_m_m_mafl";
regexp7.lastIndex; // 0
regexp7.test(t); // true
regexp7.lastIndex; // 1
regexp7.test(t); // true
regexp7.lastIndex; // 3
regexp7.test(t); // true
regexp7.lastIndex; // 5
regexp7.test(t); // true
regexp7.lastIndex; // 7
regexp7.test(t); // false
带有g修饰符时,可以通过正则表达式对象的lastIndex属性指定开始搜索的位置。
var regexp8 = /m/g;
var t = "m_m_m_mafl";
// 指定lastIndex属性
regexp8.lastIndex = 7; // 指定从第7个位置开始搜索,返回false,lastIndex重置为0
regexp8.test(t); // false
regexp8.lastIndex = 0;
2.2.2 RegExp.prototype.exec()
RegExp实例对象的exec方法,返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null。
var regexp9 = /x/;
var regexp10 = /y/;
var s = "xadf";
regexp9.exec(s); // ["x", index: 0, input: "xadf", groups: undefined]
regexp10.exec(s); // null
上面代码的exec方法,返回一个数组。该数组还包含两个重要属性:
input:原字符串。index:正则表达式匹配成功的开始位置,从0开始计数。
3. 字符串实例对象方法调用正则表达式
字符串实例对象,有以下几种与正则表达式相关的方法:
String.prototype.match():返回一个包含所有匹配子字符串的数组。String.prototype.search():按照给定正则表达式搜索,返回一个整数,表示匹配开始的位置。String.prototype.relace():按照给定正则表达式进行替换,返回替换后的字符串。String.prototype.split():按照给定正则表达式进行分割,返回一个数组,成员是分割后的子字符串。
3.1 String.prototype.match()
字符串实例对象的match方法对字符串进行正则匹配,匹配成功返回一个数组,匹配失败返回null。
如果正则表达式带有g修饰符,会一次性返回所有匹配成功的结果。
var regexp11 = /x/;
var regexp12 = /y/;
var s = "xadf";
// 匹配成功,返回数组
s.match(regexp11); // ["x", index: 0, input: "xadf", groups: undefined]
// 匹配失败,返回null
s.match(regexp12); // null
// 正则表达式带有g修饰符,一次性返回所有匹配成功的结果
var regexp13 = /a/g;
var s = "abcabc";
s.match(regexp13); // ["a", "a"]
注意:字符串实例对象的match方法对字符串进行正则匹配,正则表达式是否含g修饰符,结果有所区别:
var regexp13 = /a/g;
var regexp14 = /a/;
var s = "abcabc";
// 含g修饰符
s.match(regexp13); // ["a", "a"]
// 不含g修饰符
s.match(regexp14); // ["a", index: 0, input: "abcabc", groups: undefined]
上述代码中,/a/g包含g修饰符,返回的数组,包含所有匹配项,不含index和input属性;而/a/不包含g修饰符,返回的数组,只包含第一个匹配项,且不含index和input属性。
3.2 String.prototype.search()
字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1。
"abc".search(/a/); // 0
"abc".search(/q/); // -1
3.2 String.prototype.replace()
字符串对象的replace方法可以替换匹配的值。它接受两个参数,第一个是正则表达式,第二个是替换的内容。
正则表达式如果加g修饰符,会替换所有匹配成功的值,否则,只会替换第一个匹配项的值。
// 普通调用
"abc".replace("a", "hello"); // "hellobc"
// 正则表达式调用
"abc".replace(/a/, "s"); // "sbc"
// 带g修饰符的正则表达式
"abcabcaaa".replace(/a/g, "s"); // "sbcsbcsss"
replace方法的第二个参数可以使用美元符号$,用来指代所替换的内容:
$&:匹配的子字符串$`:匹配结果前面的字符串$':匹配结果后面的字符串$n:匹配成功的第n组内容,n从1开始$$:指代美元符号$
"abcadaeafg".replace(/b/, "$&+$1-$`"); // "ab+$1-acadaeafg"
replace方法的第二个参数还可以是一个函数,将每一个匹配内容替换为函数返回值。
'3afaadf;5'.replace(/[0-9]+/g, function (number) {
return 100*number;
}); // "300afaadf;500"
3.3 String.prototype.split()
字符串对象的split方法按照正则表达式分割字符串,返回一个由分割后的各个子字符串组成的数组。
// 普通调用
'a, b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ]
// 正则分隔,去除多余的空格
'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]
4. 正则表达式修饰符
前面一直在说正则表达式修饰符,那么修饰符到底有什么用呢?
修饰符表示正则表达式的附加的规则,可以单个使用,也可以多个一起使用。
4.1 g修饰符
g修饰符表示全局匹配,正则表达式将匹配全部符合条件的结果。
4.2 i修饰符
i修饰符表示忽略大小写,默认情况下,正则表达式对象区分大小写。
4.3 m修饰符
m修饰符表示多行模式。默认情况下,^和$匹配字符串的开始处和结尾处,加上m修饰符以后,^和$还会匹配行首和行尾,即^和$会识别换行符(\n)。
5. 参考链接
本博客是自己学习笔记,原文请参考W3C官网教程。
如有问题,请及时指出!
欢迎沟通交流,邮箱:jidi_jidi@163.com
来源:CSDN
作者:丑基地
链接:https://blog.csdn.net/qq_41863849/article/details/104195386