1. 正则表达式介绍
1.1 概念解释
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
以上百度百科抄袭【传送门】
1.2 引擎
- DFA
- 传统型NFA
- POSIX NFA
详细介绍还是继续看百度百科吧 (>﹏<) 【 传送门】
2. 正则表达式使用
2.1 表达式总览
总览表2.2 常用元字符
2.2.1 内容性字符
字符 | 理解 |
---|---|
.(点) | 匹配任意单个字符。 |
\w | 单词字符,大多数情况下可等同[A-Za-z0-9_],有得引擎可匹配中文,有的不可以,如果在特殊情况下需要进行测试 |
\d | 数字,等同[0-9] |
\b | 单词边界,即排除\w以外的字符 |
\W \D | \w, \d 互斥集合 |
\s | 空白字符,等价与[\f\n\r\t\v], 互斥集合\S |
2.2.2 功能性字符
字符 | 理解 |
---|---|
[] | 区间段,比如[A-Fa-f0-7]、[aui391],前后字符ascii码值大小不可颠倒。 |
^ | 匹配字符开始的位置。 如果在[]里使用则表示匹配字符不再区间内,例如[^\d]标识匹配除\d以外的字符。 |
$ | 匹配字符的结束位置。 |
+,?,* | 表达式的出现次数或重复次数(不明确次数)。 +表示表达式出现1次或重复多次; ?表示表达式出现0次或1次; *表示表达式出现任意次数 |
{n}, {n,m}, {n,} | 表达式出现的次数(明确的次数)。{n}表示出现n次,{n, m}表示出现n到m次,{n,}出现大于n次 |
\ | 转义符 |
() | 分组获取,可使用$1...$99(最大数百度百科上是9)获取到分组匹配的结果,具体可以看总览表。 |
逻辑或,表达式的顺序会影响匹配结果,会将最先匹配到的结果返回 | |
(?=pattern) | 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分需要符合pattern表达式 |
(?!pattern) | 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分不符合pattern表达式 |
(?<=pattern) | 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分需要符合pattern表达式 |
(?<!pattern) | 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分不符合pattern表达式 |
2.3 使用技巧
正则表达式不支持逻辑计算。
编写正则表达式的思路:
- 观察需要匹配的文本特点和规律。
- 尝试性编写正则表达式,由简入深的编写。
- 反复测试正则表达式和完善表达式。
单次匹配
单词列表
house
write
first
so
these
her
long
picture
point
animal
again
us
try
查找长度5,第二个字符是o的单词
.o...
(这样匹配的时候会匹配上部分文本,以下有解决方法)
第二位是o或i的单词
.[oi]...
该表达式会匹配picture、animal
的部分,解决这个问题可以在表达式两边加上\b
, 结果
\b.[oi]...\b
子表达式和重复匹配
子表达式是表示一个复杂匹配的单元,使用()括起来的一组复杂的正则表达式。
这里写一个正则来匹配正确的IP地址作为。
((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)(25[0-5]|1\d\d|2[0-4]\d|[12]\d|\d)
等价于
((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(25[0-5]|1\d\d|2[0-4]\d|[12]\d|\d)
以上(\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])
和((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)
是子表达式。
回溯引用
回溯引用需要将要匹配的表达式分组。以下给出两个示例。
- 匹配Html的中的h标签的文本段落
<h1>h1段落</h1>
<h1>h1段落</H1>
<h2>h21段落</h1>
<h2>h2段落</h2>
正确匹配的正则表达式<([Hh][1-6])>.*</\1>
其中\1
就是回溯的([Hh][1-6])
表达式。
- 查找文本中的相邻重复单词
文本
This is a block of of text, serveral words here are are repeated, and and they should not be.
表达式[ ](\w+)[ ]+\1
,会 将以上文本中的of of
、 are are
和and and
查找出来。
- 回溯替换,以下使用js代码作为示例了
var str = '2016-02-16';
var reg = /(\d{4})-(\d{2})-(\d{2})/;
var ret = str.replace(reg, "$1-$3-$2");
console.log(ret);
贪婪匹配和非贪婪匹配
贪婪匹配,尽可能多的匹配文本,正则表达式默认启用的就是贪婪模式, +和都是贪婪匹配的字符;而非贪婪匹配,则是尽可能少的匹配文本,启用非贪婪模式则使用*?。
文本aaaaa
使用a+
(贪婪模式)则会匹配整段文本
而使用a+?
只则匹配文本中的单个a
字符;
html <div>第一段文本html内容</div><div>第二段html内容</div>
<div>.*</div>
表达式会匹配整段代码,即贪婪模式。
<div>.*?</div>
表达式只会匹配 <div>第一段文本html内容</div>
,即非贪婪模式。
网友评论