正则表达式入门

正则表达式: 又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。

本文为好友授权转载,原地址为http://blog.csdn.net/sevenlater/article/details/50708153

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次,
{n, m} 表示出现n到m次,
{n,} 出现大于n次
\ 转义符
() 分组获取,可使用1…99(最大数百度百科上是9)获取到分组匹配的结果,具体可以看总览表。
逻辑或 表达式的顺序会影响匹配结果,会将最先匹配到的结果返回
(?=pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分需要符合pattern表达式
(?!pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分不符合pattern表达式
(?<=pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分需要符合pattern表达式
(? 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分不符合pattern表达式

2.3 使用技巧

正则表达式不支持逻辑计算。
编写正则表达式的思路:

  1. 观察需要匹配的文本特点和规律。
  2. 尝试性编写正则表达式,由简入深的编写。
  3. 反复测试正则表达式和完善表达式。

单词匹配
单词列表

1
2
3
4
5
6
7
8
9
10
11
12
13
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地址作为。

1
2
((\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标签的文本段落

1
2
3
4
<h1>h1段落</h1>
<h1>h1段落</H1>
<h2>h21段落</h1>
<h2>h2段落</h2>

正确匹配的正则表达式<([Hh][1-6])>.*</\1> 其中\1就是回溯的([Hh][1-6])表达式。

查找文本中的相邻重复单词
文本

1
2
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代码作为示例了

1
2
3
4
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字符;

1
2
3
html <div>第一段文本html内容</div><div>第二段html内容</div> 
<div>.*</div>表达式会匹配整段代码,即贪婪模式。
<div>.*?</div>表达式只会匹配 <div>第一段文本html内容</div>,即非贪婪模式。

3常用正则表达式

规则 正则表达式语法
一个或多个汉字 ^[\u0391-\uFFE5]+$
邮政编码 ^[1-9]\d{5}$
QQ号码 ^[1-9]\d{4,10}$
邮箱
1
^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ 
用户名 (字母开头 + 数字/字母/下划线)
1
^[A-Za-z][A-Za-z1-9_-]+$
手机号码
1
2
 ^1[3|4|5|8][0-9]\d{8}$ 
URL ^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
18位身份证号
1
^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$ 
-------------感谢您的阅读祝您生活愉快!-------------
支持一杯咖啡
0%