manlili blog

正则表达式入门

最近心血来潮想整理一下正则表达式。

定位

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

作用

  • 测试字符串内的模式。
    例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
  • 替换文本。
    可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
  • 基于模式匹配从字符串中提取子字符串。
    可以查找文档内或输入域内特定的文本。

常用的正则匹配工具

(1) (https://c.runoob.com/front-end/854)[https://c.runoob.com/front-end/854]

创建正则表达式

1 var regexp = /aabb/g; //g可省
2 var regexp = new Regexp(“xyz”,”g”); //第二个参数可省

区别在于:
1.采用字面量的写法新建的正则表达式对象在代码编译时就会生成,是平常开发中常用的方式;
2.采用构造函数生成的正则对象要在代码运行时生成

举个例子:

1
2
3
4
5
var re = new RegExp();//RegExp是一个对象,和Aarray一样
//但这样没有任何效果,需要将正则表达式的内容作为字符串传递进去
re =new RegExp("a");//最简单的正则表达式,将匹配字母a
re=new RegExp("a","i");//第二个参数,表示匹配时不分大小写

使用正则表达式

正则对象的方法是指这样使用的:RegExp对象.方法(字符串)
字符串对象的方法是这样使用:字符串.方法(RegExp对象)

正则查找范围

•g (全文查找,可以查看所有的匹配而不是只找到第一个匹配后就停止)
•i (忽略大小写)
•m (多行查找)
举个例子:

1
var re = new RegExp("a","gi");//匹配所有的a或A

正则表达式还有另一种正则表达式字面量的声明方式,上面例子可改写为:

1
var re = /a/gi;

正则表达式字符

元字符

  • “^” :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置,但是在[]里面使用^代表取反
  • “$” :$会匹配行或字符串的结尾
  • “\b”:不会消耗任何字符只匹配一个位置,常用于匹配单词边界
  • “\d”: 匹配数字
  • “\w”:匹配字母,数字,下划线
  • “\s”:匹配空格
  • “.” :匹配除了换行符以外的任何字符
  • “[abc]”: 匹配所包含的任意一个字符,即a或b或c

几种反义

写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了

  • “\W” 匹配任意不是字母,数字,下划线 的字符
  • “\D” 匹配任意非数字的字符
  • “\B” 匹配不是单词开头或结束的位置
  • “[^abc]” 匹配除了abc以外的任意字符

正则查询方式

贪婪(贪心)方式

如”*”字符 贪婪量词会首先匹配整个字符串。

  • 尝试匹配时,它会选定尽可能多的内容,也就是整个输入。
  • 量词首次尝试匹配整个字符串,如果失败则回退一个字符后再尝试,这个过程叫做回溯。
  • 它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。
  • 相比下面两种贪婪量词对资源的消耗是最大的。

懒惰(勉强)方式

  • 它从目标的起始位置开始尝试寻找匹配,每次检查字符串的一个字符。最后它会尝试匹配整个字符串。
  • 要使一个量词成为懒惰的,必须在普通量词后添加一个”?”

占有方式

  • 它会覆盖整个目标然后尝试寻找匹配内容,但它只尝试一次,不会回溯。
  • 要使一个量词成为占有的,必须在普通量词后添加一个”+”

举个例子:
例子①字符串”a=====b=====b===”检测它的用正则表达式

1
a.*b

贪婪工作方式
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来

  1. a=====b=====b=== 不匹配,吐出一字符
  2. a=====b=====b== 不匹配,再吐出一字符
  3. a=====b=====b= 不匹配,再吐出一字符
  4. a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败

最终将匹配满足条件最长的字符串 a=====b=====b,因为它比较贪,因此被称为贪婪量词。

例子②字符串”a=====b=====b===”检测它的用正则表达式

1
a.*?b

将匹配满足条件最短的字符串 a=====b , *? 比较懒,因此称为懒惰或者是勉强量词。

懒惰工作方式
从左边一个一个地吃掉字符

  1. a 不能匹配表达式,继续吃
  2. a= 不能匹配表达式,继续吃
  3. a== 不能匹配表达式,继续吃
  4. a=== 不能匹配表达式,继续吃
  5. a==== 不能匹配表达式,继续吃
  6. a===== 不能匹配表达式,继续吃
  7. a=====b 呵呵,终于能匹配表达式了,匹配结束,匹配位置留于字符 b 后面,继续其他的匹配。如果不能匹配则一个一个地吃掉整个字符串直到吃完为止若还没有匹配则匹配失败。

例子③字符串”a=====b=====b===”检测它的用正则表达式

1
a.*+b

占有工作方式
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来,结果没查到,匹配失败,结束。

正则量词

贪婪限定词(默认方式)

未经修饰的量词就是贪心量词

“*” 重复零次或更多
例如”aaaaaaaa” 匹配字符串中所有的a 正则: “a*” 会出到所有的字符”a”

“+” 重复一次或更多次
例如”aaaaaaaa” 匹配字符串中所有的a 正则: “a+” 会取到字符中所有的a字符, “a+”与”a“不同在于”+”至少是一次而”“ 可以是0次,
稍后会与”?”字符结合来体现这种区别

“?” 重复零次或一次
例如”aaaaaaaa” 匹配字符串中的a 正则 : “a?” 只会匹配一次,也就是结果只是单个字符a

“{n}” 重复n次
例如从”aaaaaaaa” 匹配字符串的a 并重复3次 正则: “a{3}” 结果就是取到3个a字符 “aaa”;

“{n,m}” 重复n到m次
例如正则 “a{3,4}” 将a重复匹配3次或者4次 所以供匹配的字符可以是三个”aaa”也可以是四个”aaaa” 正则都可以匹配到

“{n,}” 重复n次或更多次
与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则”a{3,}” a至少要重复3次

惰性限定词

懒惰的基本特性就是匹配尽可能少的字符,一般是在贪婪限定词后面加个?。

“*?” 重复任意次,但尽可能少重复
如 “acbacb” 正则 “a.*?b” 只会取到第一个”acb” 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而”acbacb”最少字符的结果就是”acb”

“+?” 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次

“??” 重复0次或1次,但尽可能少重复
如 “aaacb” 正则 “a.??b” 只会取到最后的三个字符”acb”

“{n,m}?” 重复n到m次,但尽可能少重复
如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是0次所以取到结果为空

“{n,}?” 重复n次以上,但尽可能少重复
如 “aaaaaaa” 正则 “a{1,}” 最少是1次所以取到结果为 “a”

占有限定词

占有式量词很像贪心式量词,一般是在贪婪限定词后面加个+,它会选择尽可能多的内容,但它不回溯。它不会放弃找到的内容,它很自私。优点是速度快。

“*+” 重复任意次,只查询一次
“++” 重复1次或更多次,只查询一次
“?+” 重复0次或1次,只查询一次
“{n,m}+” 重复n到m次,只查询一次
“{n,}+” 重复n次以上,只查询一次

请我喝杯果汁吧!