正则表达式

正则学习

准备:

正则表达式并不是一种完备的程序设计语言,它甚至算不上是一种额能够直接安装运行的程序,正则表达式是内置于其他语言或者软件产品里面的迷你语言,大多数语言和工具都支持正则表达式.

使用正则表达式

不存在所谓的正则表达式程序,在绝大多数的产品软件,编程语言,工具程序和开发环境里,正则表达式语言都已被实现.

正则表达式的使用方法和具体功能,在不同的应用程序和语言中各有不同

在使用正则表达式之前,应该了解以下几个事实:

  • 同一个问题有很多种解决办法,正则并不是唯一的
  • 学习正则表达式和其他语言一样,重在实践实践,在实践.

匹配纯文本

直接使用纯文本进行匹配

JavaScript

匹配

JavaScript is not Java
中的 JavaScript

有多个结果匹配

大多数正则表达式引擎的默认行为是只返回一个匹配结果.为了匹配多个正则表达式提供了 g

字母大小写问题

可以使用 i 标志来强制执行不区分大小写匹配搜索

匹配任意字符

在正则表达式中, . (英文句号) 可以匹配人以单个的字符

匹配特殊字符

有些字符在正则中有特殊意义, 如果要匹配这个字符本身,就需要在符号签名加入一个\字符来进行转义.

匹配一组字符

匹配多个字符中的某一个

正则使用 [any characher] 捕获这个集合中的任意字符.
例如:
[ab]c
就会匹配
ac
bc

这里还有字符区间:

  • A-Z 匹配 A 到 Z 的所有大写字母
  • a-z 匹配 a 到 z 的所有小写字母
  • A-F 匹配 A 到 F 的所有大写字母
  • A-z 匹配大小写的字母

取非匹配

就是给定一个集合,匹配这个集合之外的字符.

使用元字符 ^来标识对一个字符集合进行取非匹配.

例如 [^zx] , 即不匹配 z 也不匹配 x, [^0-9] 不匹配任何数字

使用元字符

元字符是一些在正则表达式中有着特殊含义的字符,因为元字符在正则中有特殊的含义,所以这些字符就无法用来代表他们本身,所以需要转义

例如:
t[t]
匹配 ‘t[t]’
如果不转义的话就会被理解为限定第二个字符为 t 而不是括号

匹配空白字符

常见空白字符

元字符 说明
[\b] 回退(并删除)一个字符
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符

匹配数字

数字元字符

元字符 说明
\d 任何一个数字字符
\D 任何一个非数字字符

匹配字母和数字

元字符 说明
\w 任何一个字母数字字符或者下划线等价于[a-zA-Z0-9_]
\W 和\w 相反

匹配空白字符(与非空白字符)

元字符 说明
\s 任何一个空白字符
\S 任何一个非空白字符

匹配十六进制或八进制数值

  1. 使用十六进制 \x
  2. 使用八进制 \0

重复匹配

要想匹配同一个字符或者字符集的多次重复,只要简单的给这个字符或者字符集加上一个+字符作为后缀就可以了, + 匹配一个或者多个字符. 例如 a 匹配 a 背身, a+将匹配一个或者多个连续出现的 a

匹配零个或者多个字符

使用 _ 元字符来完成, _ 的用法与 + 完全一样, 只要把它放在一个字符或者字符集后面,就可以匹配该字符连续出现零次或者多次的情况.

匹配零个或者一个字符

使用 ? 可以匹配一个字符的零次或者一次出现,最多不超过一次.

例如使用
https?
可以匹配 http 和 https

重复匹配指定次数

使用{2}来指定匹配次数 a{5}匹配连续出现五次的 a

重复次数区间

使用{1,5} 来匹配重复区间例如 a{1,4} 最少出现一次,最多出现四次, a{3, } 表示至少出现三次

防止过度匹配

贪婪就是尽可能多的匹配,懒惰就是尽可能少的匹配

贪婪元字符 懒惰元字符
* *?
+ +?
{b,} {n,}?

位置匹配

边界

位置匹配用来解决在设呢地方进行字符串匹配操作的问题.

单词边界

第一种边界,由限定符\b 指定单词边界,用来匹配一个单词的开始或者结尾

\bcat\b

the cat scattere his food all over the room

匹配 cat

\b 匹配的是一个这样的位置,这个位置位于一个能够来构成单词的字符和一个不能用来构成单词的字符之间

字符串边界

字符串边界用来进行与字符串有关的位置匹配,用来定一个字符串边界的元字符有两个:一个使用来定义字符串开头的^, 另一个是用来定义字符串结尾的$.

使用子表达式

子表达式是一个跟大的表达式的一部分, 把一个表达式划分为一系列子表达式的目的是为了吧哪些子表达式当做一个独立元素来使用, 子表达式必须使用()包裹

子表达式的嵌套

子表达式允许嵌套,事实上,子表达式允许多重嵌套,这种嵌套层次理论上没有限制

多重嵌套的子表达式可以构造出功能及其西青大的正则表达式,但是会变得难以阅读和理解,但是大多数嵌套子表达式都没有他们看上去那么复杂.

回溯引用: 前后一致匹配

回溯引用用于匹配进行前后一致匹配.