瞎说系列之正则表达式入门

前言

一直以来也没有写文章的习惯,前不久在公司内部进行技术分享之后,发现写技术文章还是非常重要的,因此将之前分享过的内容整理出来,写成此文章。之后会不定期更新瞎说系列教程,敬请期待。如有不妥,欢迎大家不吝赐教。

简介

正则表达式,又称规则表达式。(在代码中常简写为regex)。正则表达式通常被用来检索,替换那些符合某个模式的文本。

正则表达式是对字符串(包括普通字符(例如:a到z之间的字母)和特殊字符(又称为元字符))操作的一种逻辑公式。用事先定义好的一些特定字符,以及这些特定字符的组合,组成一个“规则字符串”,这个规则字符串用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

语法

下面详细的介绍正则表达式的语法。

字符类

元字符是拥有特殊意义的字符。

常用元字符
字符等价含义
.[^\n\r]匹配任何单个字符,除了换行符和回车符。
\w[a-zA-Z_0-9]匹配任何单词字符(数字,字母,下划线)
\W[^a-zA-Z_0-9]匹配任何非单词字符
\d[0-9]匹配数字。
\D[^0-9]匹配非数字。
\s[\n\f\r\t\v\x0B]匹配空白字符。(包括空格符,制表符,回车符,换行符,垂直换行符,换页符)。
\n\n匹配换行符。
\f\f匹配换页符。
\r\r匹配回车符。
\t\t匹配制表符。
\v\v匹配垂直制表符。
\\转义字符,转义后面字符所代表的含义(比如\*匹配的是*)
\0Null匹配null

换行符和回车符的区别可以参考阮一峰的文章

量词

量词用来表示匹配的数量。

字符等价含义
n?n{0,1}匹配任何包含0个或1个的字符串(最多有一个)。
n+n{1,}匹配任何包含至少1个的字符串(至少一个)。
n*n{0,}匹配任何0个或多个的字符串。
n{x}n{x}匹配包含x个n的序列的字符串。
n{x,}n{x,}匹配包含至少x个n的序列的字符串。
n{x,y}n{x,y}匹配出现x次但是不超过y次的n的序列的字符串。
定位符

定位符顾名思义用来确定位置的字符。

字符含义
^单独使用表示匹配表达式的开始。
$匹配表达式的结尾。
\b匹配一个单词字符的边界。单词字符后面或前面不与另外的单词字符相邻,可以理解为匹配一个单词的开始或者结束。(比如:/bx/可以匹配s x)。
\B匹配非单词的边界。可以理解为查找不处在单词的开始或者结束的位置。
标志字符
字符含义
g匹配全局。
i不区分大小写。
m多行搜索。
范围类
字符含义
[0-9]匹配0到9之间的任意一个数字
[a-z]匹配a到z之间的任意一个字符。
[A-Z]匹配A到Z之间的任意一个字符。
[^0-9]匹配不在0到9之间的任意一个字符。
其他规则
字符含义
(pattern)匹配pattern并获取这一匹配,即捕获组。
(?:pattern)匹配pattern但不获取匹配结果,即非捕获组。
(?=pattern)正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非捕获组匹配。例如/windows(?=95)/可以匹配windows95中的windows,但是不能匹配windows98中的windows。可以理解为匹配(?=pattern)外面且在前面的内容。
(?!pattern)正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这也是一个非捕获组匹配。例如/windows(?!95)/可以匹配windows98中的windows,但是不能匹配windows95中的windows
(?<=pattern)反向肯定预查,与正向肯定预查相似,只是方向相反。正向肯定预查是匹配前面的内容,而反向肯定预查是匹配后面的内容。例如(?<=95)windows能匹配95windows中的windows,但是不能匹配98windows的windows,也不能匹配windows95中的windows。
(?<!pattern)反向否定预查,与正向否定预查相似,只是方向相反。例如(?<!95)windows能匹配98windows中的windows,但是不能匹配95windows中的windows,也不能匹配windows95中的windows。

运算符优先级

正则表达式是从左到右进行计算,并遵循优先级顺序。相同的优先级从左到右计算,不同优先级从高到低计算。下表为表达式运算符从高到低的优先级顺序。

字符含义
\转义字符。
(), (?:), (?=), []圆括号和方括号。
*, +, ?, {n}, {n,}, {n,m}量词等限定符。
^, $, \任何元字符、任何字符定位点和序列(即位置和顺序)。

贪婪模式和非贪婪模式

正则表达式的贪婪模式和非贪婪模式是相对于量词这个限定符来说的。默认情况下,正则的所有量词(限定符)都是贪婪模式,即尽可能多的去匹配字符。而在量词(限定符)后面加上?就变成了非贪婪模式,即尽可能少的去匹配字符。

举个

相关推荐