JavaScript 正则表达式
一、定义一个正则表达式
// js中定义正则表达式有两种方法:
// 1、“/正则表达式/修饰符”:
var reg1 = /hello \w{3,12}/g;
//2、“new RegExp('正则表达式', '修饰符')”:
var reg2 = new RegExp("hello \\w{3,12}", 'g');
// 其中,修饰符为可选项(可多选),有三个取值:g全局匹配、i不区分大小写、m多行匹配;
RegExp 对象自带的属性:
属性 | 描述 | 例子 |
---|---|---|
global | RegExp 对象是否具有标志 g | console.log(reg1.global); // true |
ignoreCase | RegExp 对象是否具有标志 i | console.log(reg1.ignoreCase); // false |
multiline | RegExp 对象是否具有标志 m | console.log(reg1.multiline); // false |
lastIndex | 一个整数,标示开始下一次匹配的字符位置 | console.log(reg1.lastIndex); // 0 |
source | 正则表达式的源文本 | console.log(reg2.source); // hello \w{3, 12} |
二、调用 RegExp 对象中的方法
RegExp 对象给我们提供了三种方法供我们使用,分别是 test()、exec() 和 compile();
1、test()
检索字符串中指定的值。返回 true 或 false。这个最常用;
var reg = /hello \w{3,12}/g; // 大括号中逗号前后不能有空格
console.log(reg.test('hello hi')); // false
console.log(reg.test('hello HuJinqun')); //true
2、exec()
检索字符串中指定的值。匹配成功就返回一个数组,匹配失败就返回null;
var data = "abc123efg456";
var reg = /\d+/g;
var reg2 = /\d{4}/g;
console.log(reg.exec(data)); // [ '123', index: 3, input: 'abc123efg456', groups: undefined ]
console.log(reg2.exec(data)); // null
3、compile()
compile() 方法用于改变 RegExp。
compile() 既可以改变检索模式,也可以添加或者删除第二个参数;
var data = "abc123efg456";
var reg = /\d+/g;
console.log(reg.exec(data)); // [ '123', index: 3, input: 'abc123efg456', groups: undefined ]
reg.compile('abc');
console.log(reg.exec(data)); // [ 'abc', index: 0, input: 'abc123efg456', groups: undefined ]
reg.compile('BC', 'i');
console.log(reg.exec(data)); // [ 'bc', index: 1, input: 'abc123efg456', groups: undefined ]
reg.compile(/\d{2}/);
console.log(reg.exec(data)); // [ '12', index: 3, input: 'abc123efg456', groups: undefined ]
三、正则表达式拓展方法
除了 RegExp 对象提供方法之外,String 对象也提供了四个方法来使用正则表达式;
var data = "abc123efg456";
1、match()
在字符串内检索指定的值,匹配成功返回存放匹配结果的数组,否则返回 null。这里需要注意的一点,如果没有设置全局匹配 g,返回的数组只存放第一个成功匹配的值。
var reg = /\d+/g;
console.log(data.match(reg)); // [ '123', '456' ]
var reg2 = /\d+/;
console.log(data.match(reg2)); // [ '123', index: 3, input: 'abc123efg456', groups: undefined ]
console.log(data.match(reg2)[0]); // 123
console.log(data.match(reg2)[1]); // undefined
console.log(data.match(reg2)[2]); // undefined
console.log(data.match(reg2)[3]); // undefined
2、search()
在字符串内检索指定的值,匹配成功返回第一个匹配成功的字符串开始的位置,否则返回 -1;(返回第一个匹配到的 index)
var reg = /\d+/;
console.log(data.search(reg)); // 3
console.log(data.search(/b/)); // 1
console.log(data.search(/i/)); // -1
3、replace()
替换与正则表达式匹配的字串,并返回替换后的字符串。在不设置全局匹配 g 时,只替换第一个匹配成功的字符串片段;
console.log(data.replace('123', 'HJQ')); // abcHJQefg456
console.log(data.replace(/\d+/, 'HJQ')); // abcHJQefg456
console.log(data.replace(/\d+/gi, 'HJQ')); // abcHJQefgHJQ
var str = '<a><bbb>';
var regexp = /<(.*?)>/g;
console.log(str.replace(regexp, '[$1]')); // [a][bbb]
var str = '<a><bbb>';
var regexp = /<(a)><(b+)>/g;
console.log(str.replace(regexp, '[$2]{$1}')); // [bbb]{a}
// 说明:$1 $2 ... 代表第一个分组,第二个分组 ...
4、split()
把一个字符串分割成字符串数组;
var reg = /\d{2}/;
console.log(data.split('3')); // [ 'abc12', 'efg456' ]
console.log(data.split(reg)); // [ 'abc', '3efg', '6' ]
四、其他扩展表示
var data = 'a1B2ce3@4.5d_6f';
console.log(data.match(/[a-z](?=\d)/gi)); // [ 'a', 'B', 'e' ]
console.log(data.match(/[a-z](?!\d)/gi)); // [ 'c', 'd', 'f' ]
console.log(data.match(/(?<=[a-z])\d/gi)); // [ '1', '2', '3' ]
console.log(data.match(/(?<!\d)[a-z]+/gi)); // [ 'a', 'e' ]