2 - 正则量词、属性、方法、使用技巧

242 阅读2分钟

知识点

  1. 量词
量词描述
n+{1,正无穷} 0-9A-z_
n*{0,正无穷} 0-9A-z_
n?{0,1} 出现0或1次
n{x,y}{1,正无穷} === n+ {0,正无穷} === n* {0,1} === n?
^n匹配任何以n开头的字符串
n$匹配任何以n结尾的字符串
?=n匹配任何其后紧接着指定字符n的字符串 (正向预查:?=)
?!n匹配任何其后不紧接着指定字符n的字符串
  1. 正则默认贪婪匹配
  • 贪婪模式:字符串从左到右一次匹配多,再匹配少,如果一旦匹配上就不回头匹配;
  • 贪婪模式的原则:能匹配多个,绝不匹配少个;
  1. ?的用法
  • n?:{0,1} 出现0或1次;
  • ?=n(?!n):匹配任何其后(不)紧接着指定字符n的字符串;
  • *?:非贪婪模式;
  1. 子表达式 反向引用
  • ()子表达式有记忆功能;
  • \1:反向引用第一个子表达式;
  • xxxx:出现1次,反向引用3次
  1. reg.source、reg.multiline
  • reg.source:正则的本体
  • reg.multiline:属性返回一个布尔值,用于指示当前正则表达式对象实例是否带有multiline标志(m)
  1. reg.lastIndex()、reg.exec()
  • reg.lastIndex()和reg.exec()方法里的index默认吻合;
  • reg.lastIndex()可以操作reg.exec()里的index属性

一、正则量词

1. n+:{1,正无穷} 0-9A-z_

var reg = /\w+/g,
    str = 'abcdefg';
console.log(str.match(reg)); // ["abcdefg"]

2. n*:{0,正无穷} 0-9A-z_

var reg = /\w*/g,
    str = 'abcdefg';
console.log(str.match(reg)); // ["abcdefg", ""]

3. n?:{0,1} 出现0或1次

var reg = /\w?/g,
    str = 'abcdefg';
console.log(str.match(reg)); // ["a", "b", "c", "d", "e", "f", "g", ""]

4. n{x,y} {1,正无穷} === n+ {0,正无穷} === n* {0,1} === n?

var reg = /\w{0,}/g,
    reg1 = /\w{8,}/g, // 出现8-正无穷次
    str = 'abcdefg';
console.log(str.match(reg)); // ["abcdefg", ""]  
console.log(str.match(reg1)); // null 

5. ^n:匹配任何以n开头的字符串、n$:匹配任何以n结尾的字符串

5.1 检查字符串是否以abcd开头和以abcd结尾

var str = 'abcd123123abcd',
    // \s\S:所有字符串,*:出现任意次,^abcd:以abcd开头,abcd$:以abcd结尾
    reg = /^abcd[\s\S]*abcd$/g,
    // .*:匹配出现0-正无穷次除了回车和换行的所有字符
    reg1 = /^abcd.*abcd$/g,
    reg2 = /^abcd|abcd$/g; // | :或
console.log(str.match(reg)); //["abcd123123abcd"]
console.log(str.match(reg1)); // ["abcd123123abcd"]
console.log(str.match(reg2)); //  ["abcd", "abcd"]

5.2 检查字符串是否以abcd开头和以abcd结尾,并且开头结尾之间是数字

var str = 'abcd123123abcd',
    reg = /^abcd\d+abcd$/g;
console.log(str.match(reg)); //["abcd123123abcd"]

5.3 匹配以138开头的11位手机号码

var str = '13854752154',
    reg = /^138[\d]{8}/g;
console.log(str.match(reg)); //["13854752154"]

6. ?=n:匹配任何其后紧接着指定字符n的字符串

 var str = 'abcdaccd',
     reg = /a(?=b)/g, // 匹配a后面跟着b的a
     reg1 = /a(?!b)/g; //匹配a后面不跟着b的a
console.log(str.match(reg)); //["a"]--第1个a
console.log(str.match(reg1)); //["a"]--第2个a

二、正则属性、方法、使用技巧

1. xxxx xxyy 子表达式 反向引用

  • ()子表达式有记忆功能;
  • \1:反向引用第一个子表达式;
  • xxxx:出现1次,反向引用3次
var str = 'bbbaaaaccaaaaiddddaaaa',
    reg = /(\w)\1\1\1/g; //\1:反向引用第一个子表达式中所记忆的那个字符串3次,
console.log(str.match(reg)); // ["aaaa", "aaaa", "dddd", "aaaa"]

2. reg.source、reg.multiline

  • reg.source:正则的本体
  • reg.multiline:属性返回一个布尔值,用于指示当前正则表达式对象实例是否带有multiline标志(m)
var str = 'aabbccdddddcceevv',
    reg = /(\w)\1(\w)\2/gim;
console.log(str.match(reg)); // ["aabb", "ccdd", "ddcc", "eevv"]
console.log(reg.source); // (\w)\1(\w)\2 -- reg.source:正则的本体
console.log(reg.multiline); // true

3. reg.lastIndex()、reg.exec()

  • reg.lastIndex()和reg.exec()方法里的index默认吻合;
  • reg.lastIndex()可以操作reg.exec()里的index属性
var str = '123123123123123',
    reg = /123/g;
console.log(str.match(reg)); //["123", "123", "123", "123", "123"]
console.log(reg.exec(str));
console.log(reg.lastIndex); //3
reg.lastIndex = 4; //设置下次匹配的属性为4,但是exec()匹配的下标为3的倍数,所以index为6
console.log(reg.exec(str)); // index--> 6