核心提示:正则表达式适用场景:正则表达式对象RegExp:exec()/test()字符串String:match()/search()/split()/replace()创建正则表达式正则表达式字面量: /a...
正则表达式
适用场景:
正则表达式对象RegExp:exec()/test()
字符串String:match()/search()/split()/replace()
创建正则表达式
正则表达式字面量: /abc/gim 正则表达式对象 : new RegExp('abc', 'gim')使用字面量和正则构造函数创建的区别: 字面量是编译时处理,使用构造函数则是在运行时处理。因此字面量有更好的性能,构造函数适用于正则模式可能会改变或者是由用户输入的情况。
特殊字符
\ 转义字符:在非特殊字符之前表示下一个字符是特殊的,在特殊字符之前表示将下一个字符的特殊性移除 ^ 匹配输入的开始。在字符集[]中的起始位置则表示 非 $ 匹配输入的结束 * 匹配前一个表达式0次或多次,等价于{0,} + 匹配前一个表达式1次或多次,等价于{1,} ? 匹配前一个表达式0次或1次,等价于{0,1} . 匹配除换行符之外的所有单个字符 (x) 匹配’x’并记住,括号也称作捕获括号,在正则表达式的匹配环节用\1 \2 \n来访问,在正则的替换环节(通常是字符串的replace()函数中)用$1 $2 $n来访问 (?:x) 匹配但不记住’x’,也叫做非捕获括号 x(?=y) 匹配x仅当x后面紧跟着y x(?!y) 匹配x仅当x后面没有紧跟着y x|y 匹配x或y {n} 匹配前一个字符正好出现n次 {n,m} 匹配前一个字符出现次数>= n <=m [xyz] 字符集合,匹配方括号中的任意字符 [^xyz] 反向字符集,匹配没有包含在方括号中的任意字符 \b 匹配一个词的边界 \B 匹配一个非单词边界 \d 匹配一个数字 \D 匹配一个非数字字符 \s 匹配一个空白字符,包括空格、换行符、制表符、换页符 \S 匹配一个非空白字符 \w 匹配一个单字字符(数字字母下划线),等价于[a-zA-Z0-9_] \W 匹配一个非单字字符(数字字母下划线),等价于[^a-zA-Z0-9_]四个可选参数:可以任意顺序组合
g 全局匹配 i 不区分大小写 m 多行搜索 y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。函数详解
Regexp的exec()
首先要注意如果使用一个未分配给一个变量的正则表达式,那么随后将不能访问这个正则表达式执行结果后的属性。例如:/a/g.exec('abca') // ["a", index: 0, input: "abca"] /a/g.lastIndex // 0 // 如果要访问正则的执行后的属性,应该把它先赋值给一个变量 var r = /a/g; // undefined r.exec('abca') // ["a", index: 0, input: "abca"] r.lastIndex // 1 r.exec('abca') // ["a", index: 3, input: "abca"] r.lastIndex // 4exec 执行后如果匹配失败会返回null,如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。数组中的返回字段如下图。array中有三个元素,第一个array[0]是匹配到的子串,array[1]到array[n]是括号中捕获到的分组,array[‘index’]是匹配到的索引,array[‘input’]是初始字符串。执行后正则表达式变量的两个属性是lastIndex和source,表示下一次匹配的开始索引,正则表达式的模式文本。
var r = /a/ // undefined r.exec('abca') // ["a", index: 0, input: "abca"] r.lastIndex // 0 r.exec('abca') // ["a", index: 0, input: "abca"] r.lastIndex // 0 var r2 = /a/g // undefined r2.exec('abca') // ["a", index: 0, input: "abca"] r2 // /a/g r2.lastIndex // 1 r2.exec('abca') // ["a", index: 3, input: "abca"] r2.lastIndex // 4 r2.exec('abca') // null r2.lastIndex // 0 r2.exec('abca') // ["a", index: 0, input: "abca"] r2.lastIndex // 1利用exec()如何找到全部的匹配呢?只能循环:
var r = /a/g; var str = 'aba'; var array = []; while ((array = r.exec(str)) !== null) { console.log('result is: %s, next index at: %d', array[0], r.lastIndex); }
Regexp的test()
匹配成功返回true,失败返回false,要注意有全局标识g的时候与exec类似,其lastIndex不断变化的问题
var r = /a/g; // undefined r.test('aba') true r.lastIndex // 1 r.test('aba') true r.lastIndex // 3 r.test('aba') false r.lastIndex // 0 r.test('aba') // true r.lastIndex // 1
String的match()
成功匹配则返回值array是一个包含了整个匹配结果以及任何括号捕获的匹配结果的 Array ;如果没有匹配项,则返回 null。
注意match匹配时正则表达式是否有 全局搜索标志g 的情况是完全不同的。
例如:
'aacbc'.match(/(a*)c/g) // (2) ["aac", "c"] 'aacbc'.match(/(a*)c/) // (2) ["aac", "aa", index: 0, input: "aacbc"]
String的search()
与RegExp的test()类似,不过找到了返回下标,没找到返回-1
String的split()
split参数接受字符串或者正则表达式,返回数组
String的replace()
替换的时候可以用
var r = /(\w*)\s(\w*)/; var s = 'abc def'; s.replace(r, '$2, $1'); // "def , abc"
参考文档:
mdn 正则表达式 mdn exec()方法 mdn match()方法