正则表达式三分钟入门


正则表达式在几乎所有语言中都可以使用,无论是前端的JavaScript、还是后端的Java、c#。他们都提供相应的接口/函数支持正则表达式。

正则基础知识点:

1.元字符

万物皆有缘,正则也是如此,元字符是构造正则表达式的一种基本元素。
我们先来记几个常用的元字符:

正则表达式三分钟入门

2. 重复限定符

有了元字符就可以写不少的正则表达式了,但细心的你们可能会发现:别人写的正则简洁明了,而不理君写的正则一堆乱七八糟而且重复的元字符组成的。为了处理这些重复问题,正则表达式中一些重复限定符,把重复部分用合适的限定符替代,下面我们来看一些限定符:

正则表达式三分钟入门

3. 分组

正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。

4. 转义

我们看到正则表达式用小括号来做分组,那么问题来了:

如果要匹配的字符串中本身就包含小括号,那是不是冲突?应该怎么办?

针对这种情况,正则提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,做法很简答,就是在要转义的字符前面加个斜杠,也就是\即可。

5. 条件或

正则用符号 | 来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。

6. 区间

正则提供一个元字符中括号 [] 来表示区间条件。
  1. 限定0到9 可以写成[0-9]
  2. 限定A-Z 写成[A-Z]
  3. 限定某些数字 [165]

 

正则进阶知识点:

1. 零宽断言

无论是零宽还是断言,听起来都古古怪怪的,
那先解释一下这两个词。
  1. 断言:俗话的断言就是“我断定什么什么”,而正则中的断言,就是说正则可以指明在指定的内容的前面或后面会出现满足指定规则的内容,
    意思正则也可以像人类那样断定什么什么,比如"ss1aa2bb3",正则可以用断言找出aa2前面有bb3,也可以找出aa2后面有ss1.
  2. 零宽:就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果里是不会返回断言本身。

下面先来讲几种类型的断言:

  1. 正向先行断言(正前瞻):
  • 语法:(?=pattern)
  • 作用:匹配pattern表达式的前面内容,不返回本身。

2. 正向后行断言(正后顾):

  • 语法:(?<=pattern)
  • 作用:匹配pattern表达式的后面的内容,不返回本身。

3. 负向先行断言(负前瞻)

  • 语法:(?!pattern)
  • 作用:匹配非pattern表达式的前面内容,不返回本身。

4. 负向后行断言(负后顾)

  • 语法:(?<!pattern)
  • 作用:匹配非pattern表达式的后面内容,不返回本身。

2. 捕获和非捕获

单纯说到捕获,他的意思是匹配表达式,但捕获通常和分组联系在一起,也就是“捕获组”

捕获组:匹配子表达式的内容,把匹配结果保存到内存中中数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果。

而根据命名方式的不同,又可以分为两种组:

1. 数字编号捕获组:
语法:(exp)
解释:从表达式左侧开始,每出现一个左括号和它对应的右括号之间的内容为一个分组,在分组中,第0组为整个表达式,第一组开始为分组。

2. 命名编号捕获组:
语法:(?<name>exp)
解释:分组的命名由表达式中的name指定

3. 非捕获组:
语法:(?:exp)
解释:和捕获组刚好相反,它用来标识那些不需要捕获的分组,说的通俗一点,就是你可以根据需要去保存你的分组。

 

3. 反向引用

上面讲到捕获,我们知道:捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用

根据捕获组的命名规则,反向引用可分为:

  1. 数字编号组反向引用:\k
    或\number
  2. 命名编号组反向引用:\k
    或者\'name'

 

4. 贪婪和非贪婪

1.贪婪

我们都知道,贪婪就是不满足,尽可能多的要。
在正则中,贪婪也是差不多的意思:

贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。
特性:一次性读入整个字符串进行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃(这种匹配-舍弃的方式也叫做回溯),直到匹配成功或者把整个字符串舍弃完为止,因此它是一种最大化的数据返回,能多不会少。

2. 懒惰(非贪婪)

懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这匹配方式叫做懒惰匹配。
特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依此循环(读入字符、匹配)直到匹配成功或者把字符串的字符匹配完为止。

懒惰量词是在贪婪量词后面加个“?”

正则表达式三分钟入门

 

5. 反义

前面说到元字符的都是要匹配什么什么,当然如果你想反着来,不想匹配某些字符,正则也提供了一些常用的反义元字符:

正则表达式三分钟入门