正则表达式摸门把级整理

最上面放正则的优先级

正则优先级

①常用的元字符 (一些有特异功能的用来方便匹配的字符)

  代码  说明
  .   匹配除换行符以外的任意字符
  \w  匹配字母或数字或下划线(等价于[A-Za-Z0-9_]
  \s  匹配任意的空白符
  \d  匹配数字
  \b  匹配单词的开始或结束
  ^   匹配字符串的开始
  $   匹配字符串的结束

  ^\d{5,12}$  因为使用了^和$,所以检测的整个字符串都要用来和\d{5,12}来匹配,也就是说整个字符串必须是5到12个数字。

②常用的限定符 (表示它前面的字符重复的次数)

  代码  说明
  *   重复零次或更多次
  +   重复一次或更多次
  ?   重复零次或一次(还有非贪婪模式的用法)
  {n}  重复n次
  {n,}  重复n次或更多次
  {n,m}  重复n到m次

  (?0\d{2}[) -]?\d{8}  首先是一个转义字符(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现0次或1次(?),最后是8个数字(\d{8})。

③字符范围

  代码  说明
  []    匹配方括号中任意字符
  [0-9]  代表的含意与\d就是完全一致的:匹配任意一位数字

  注意在字符范围中有很多元字符不需要转义,可以代表自身,如.?+等。常见在[]内需要转义的有\和]和-

  注:如果想匹配任意汉字的话,可以使用:[\u4e00-\u9fa5]

  有时也会见到[^\x00-\xff],即匹配不是ASCII代码中十六进制代码00到ff的字符,即不是ASCII代码十进制0到255的字符,所以汉字包括在里面。

④分枝条件

  代码  说明
  |    匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
  
  \d{5}-\d{4}|\d{5}  这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。

⑤分组

  代码  说明
  ()  重复单个字符,直接在字符后面加上限定符就行了;但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了

  (\d{1,3}.){3}\d{1,3}  是一个简单的IP地址匹配表达式。 \d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

  但使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

常用分组语法

  分类   代码/语法   说明
  捕获   (exp)     匹配exp,并捕获文本到自动命名的组里
      (?exp)     匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
      (?:exp)    匹配exp,不捕获匹配的文本,也不给此分组分配组号
  零宽断言 (?=exp)   匹配exp前面的位置(断言:是真的才执行。所以在这里是exp才会匹配它前面的字符)
       (?<=exp)  匹配exp后面的位置
       (?!exp)   匹配后面跟的不是exp的位置
       (?<!exp)   匹配前面不是exp的位置
  注释    (?#comment)  这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

⑥反义

  代码/语法 说明
  \W    匹配任意不是字母,数字,下划线,汉字的字符
  \S    匹配任意不是空白符的字符
  \D    匹配任意非数字的字符
  \B    匹配不是单词开头或结束的位置
  [^x]    匹配除了x以外的任意字符
  [^aeiou]  匹配除了aeiou这几个字母以外的任意字符

  <a[^>]+>  匹配用尖括号括起来的以a开头的字符串。

⑦零宽断言(环视、断言)

  环视,就是先从全局环顾一遍正则,(然后断定结果,)再做进一步匹配处理。
  断言,就是先从全局环顾一遍正则,然后断定结果,再做进一步匹配处理。

  两个虽然字面不一样,意思却是同一个,都是做全局观望,再做进一步处理。

  环视的作用相当于对其所在位置加了一个附加条件,只有满足这个条件,环视子表达式才能匹配成功。

  代码/语法 说明
  (?=exp)    先行断言:匹配后面是exp的数据(断言:是真的才执行。所以在这里是exp才会匹配它前面的字符)
  (?!exp)    先行否定断言:匹配后面不是exp的数据
  (?<=exp)  后行断言:匹配前面是exp的数据 (JS在ES6才支持后行断言)
  (?<!exp)   后行否定断言:匹配前面不是exp的位置

eg:前端的一道笔试题:模拟数字的千位符

⑧贪婪与懒惰

  当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配

  有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

  a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

JS中有两种方式创建正则表达式对象,eg:下面创建一个匹配字符串的正则表达式对象

1
2
3
4
5
6
7
//一、正则表达式字面量方法
var my_regexp1=/"(?:\\.|[^\\\"])*"/g;

//二、RegExp构造器方法(此时有两个阶段,先经过字符串的转义,后再经过正则表达式的转义,所以经常需要双反斜杠进行转义)
var my_regexp2=new RegExp("\"(?:\\\\.|[^\\\\\\\"])*","g";
document.writeln(my_regexp1.exec('"Daoma is 666"')[0]);
document.writeln(my_regexp2.exec('"Daoma "is 666"')[0]);

  其它具体请参考:快速入门正则表达式

文章目录
  1. 1. 最上面放正则的优先级
  2. 2. ①常用的元字符 (一些有特异功能的用来方便匹配的字符)
  3. 3. ②常用的限定符 (表示它前面的字符重复的次数)
  4. 4. ③字符范围
  5. 5. ④分枝条件
  6. 6. ⑤分组
    1. 6.1. 常用分组语法
  7. 7. ⑥反义
  8. 8. ⑦零宽断言(环视、断言)
  9. 9. ⑧贪婪与懒惰
  • JS中有两种方式创建正则表达式对象,eg:下面创建一个匹配字符串的正则表达式对象
  • ,