初识正则表达式

初识正则表达式

之前对正则表达是一直处于一知半解的状态,今天抽空系统学习下正则表达式

元字符

  • \b 匹配单词边界(开始或结束)
  • . 匹配除换行外的所有字符
  • * 匹配所有字符
  • \d 匹配数字
  • \s 匹配任意空白符(空格,制表符,换行符)
  • \w 匹配字母、数字、下划线、汉字等
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束
  • \f 匹配换页符
  • \n 匹配换行
  • \r 匹配回车
  • \t 匹配制表符

常用限定符

  • * 表示重复任意次(可以是0)\d*
  • + 表示连续重复1次或更多次 \d+
  • ? 表示重复零次或一次
  • {n}表示连续重复次数 \d{5}匹配五个数字
  • {n,} 表示重复n次或更多次
  • {n,m} 表示重复n到m次

字符类

  • [aeiou] 匹配[]中的任意一个字符
  • [.?!] 匹配标点符号

分支条件

使用|进行分支
0\d{2}-\d{8}|0\d{3}-\d{8}
匹配两种格式的本地号码:010-52154852 0731-52154252
\(0\d{2}\)[-]?\d{8}|0\d{2}[-]?\d{8}|\(0\d{3}\)[-]?\d{8}|0\d{3}[-]?\d{8}
匹配四种格式的本地号码:
010-52152415 01052154852 (010)52154125 (010)-52145214
0731-52145214 073152145214 (0731)52145214 (0731)-52145214

分组

使用 ()进行分组
匹配一个正确的IP地址(ip地址不能大于256)
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
常用分组语法

  • (?:exp)匹配exp但不捕获,也不分配组号
  • (?=exp) 匹配exp前面的位置
  • (?!exp) 匹配后面跟的不是exp的字符

反义

之前的元字符大写就变成反义了

  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配非数字
  • \B 匹配非单词边界
  • [^x] 匹配除了x以为的任意字符
  • [^aeiou] 匹配除了aeiou的所有字符
    常用:\S+匹配不包含空白符的字符串
    `<a[^>]+>`匹配尖括号包围的a开头的字符串
    

反向引用

  • \1 代表分组一匹配的文本
    比如匹配重复的单词: \b(\w+)\s+\1\b => hello hello
  • 也可以自定义组名
    组名要写在分组前,且和分组包围在一起
    ?<name>或者 ?'name'
    则引用时要这样:\k<name>
    比如: \b(?<hi>\w+)\s+\k<hi>\b => hello hello
    `\b(?'hi'\w+)\s+\k<hi>\b` => `hello hello`
    

非贪婪匹配

?
例:

1
2
3
reg = /c{1,}?/;
str='ccccc';
alert(reg.exec(str)); //c