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官网教程。
如有问题,请及时指出!
欢迎沟通交流,邮箱:[email protected]