RegExp 正则匹配

166 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

RegExp

RegExp有两种方法可以创建一个RegExp对象:一种是字面量,另一种是构造函数。

let reg1 = /ab+c/i // 字面量形式
let reg2 = new RegExp('ab+c', 'i'); 
let reg3 = new RegExp(/ab+c/, 'i'); 

RegExp实例方法

  1. exec()方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
let reg = /ab*/g
let str = 'abcabcd'
let res = reg.exec(str) // res = [0: "ab",index: 0,input: "abcabcd"]

res中0:匹配的全部字符串,index:匹配的的字符串位于原字符串的索引值,input:原字符串。reg:lastIndex:下一次匹配开始的位置,ignoreCase:是否使用了 "i" 标记使正则匹配忽略大小写,global:是否使用了 "g" 标记来进行全局的匹配,source:正则匹配的字符串。

当正则表达式使用 "g" 标志时,可以多次执行 exec 方法来查找同一个字符串中的成功匹配。

let re = /ab*/g
let str = 'abcabcd'
let myArray
while ((myArray = re.exec(str)) !== null) {
  console.log(myArray[0],re.lastIndex);
}
  1. test() 表达式:regexObj.test(str),如果正则表达式与指定的字符串匹配 ,返回true;否则false
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result); // true

如果正则表达式设置了全局标志,test() 的执行会改变正则表达式lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串。具体可以参考上面的exec()方法。

var regex = /foo/g;
regex.test('foo'); // true
regex.test('foo'); // false

正则表达式中的特殊字符

这里简单列一些常用的:

  1. ^ 符号,匹配输入的开始,如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。
  let re = /^A/
  let res =  re.test('AneG') // res = true
  let res1 = re.test('abcd)   // res1 = false
  1. $ 符号,匹配输入的结束。如果多行标志被设置为 true,那么也匹配换行符前的位置。
let re = /E$/
let res = re.test('abcE') // res = true
    • 符号,匹配前一个表达式 0 次或多次。等价于 {0,}
let re = /ab*/
let res = re.test('abbE') // res = true,它所匹配的出来的字符串是 abb
    • 符号,匹配前一个表达式 1 次或多次。等价于 {1,}
  1. ? 符号,匹配前面一个表达式 0 次或者 1 次。等价于 {0,1}。例如 /e?le?/ 匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。

  2. . 符号,(小数点)默认匹配除换行符之外的任何单个字符。

  3. x|y, 匹配‘x’或者‘y’。例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’

  4. {n},n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。\比如, /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a.

  5. {n,}, 匹配了前面一个字符至少出现了 n 次。

  6. {n,m}, 匹配了前面一个字符至少出现了 n 次,最多出现m次。

  7. [xyz],匹配一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。例如,[abcd] 和 [a-d] 是一样的。他们都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。

  8. [^xyz], 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。

  9. \b, 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如: /oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。/oon\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。

  10. \d, 匹配一个数字。等价于 [0-9]。

  11. \D, 匹配一个非数字字符。等价于 [^0-9]。

  12. \w, 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]

  13. \W, 匹配一个非单字字符。等价于 [^A-Za-z0-9_]

正则表达式标志

  1. g:全局搜索。
  2. i:不区分大小写搜索。
  3. m:多行搜索。
  4. s:允许 . 匹配换行符。
  5. u:使用 unicode 码的模式进行匹配。
  6. y:执行“粘性 (sticky)”搜索,匹配从目标字符串的当前位置开始。