引言
不管在学习哪一门程序设计语言都会用到正则表达式,它已经融入到计算机的方方面面,本文主要讲解正则表达式的最基本使用方法。
正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个‘a’ 和 任意个’b’,那么’ab,‘abb’,'abbbb’都符合这个特征。
正则表达式可以用来:
(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。
(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。
(3)用来替换,比普通的替换更强大。
正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。
正则表达式中的元字符
正则表达式定义了一系列的“规则”,比如正则表达式中使用\d表示任意单个数字,使用这些规则,可以用于强大的匹配需求。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符。只要弄清楚了“数字字母等常见组成”“次数表示”“子组”等方式,就可以轻松掌握正则表达式的用法。
简单的转义字符
表达式 | 可匹配 |
---|---|
\r, \n | 代表回车和换行符 |
\t | 制表符 |
正则表达式中的元字符
记号 | 说明 | 示例 | 示例解释 | |
---|---|---|---|---|
literal | 匹配该字符 | this | this | |
re1|re2 | |为管道符,表示多选一 | Wuhan|Changsha | Wuhan或Changsha | |
常用 | . | 除换行符外的任何字符 | a.b | aab,a9b,a?b… |
\d | 任意数字,同[0,9],和\D是反义 | \d{11} | 11为数字,如手机号 | |
\D | 非数字字符 | \D{5} | 含5个非数字的字符串 | |
\w | 匹配任何数字、字母和[A-Za-z0-9]同义,和\W反义 | \w+ | 数字和字母构成的字符串均可匹配 | |
\W | 非数字字母 | |||
\s | 匹配空白符,和[\n\t\r\v\f]相同,和\S相反 | |||
\S | 非空白符号 | |||
范围 | […] | 括号中任何一个字符 | [asdf] | a,s,d,f任何一个 |
[x,y] | 匹配x到y的字符,可以有多个区间 | [0-9] | 匹配任一数字 | |
[^…] | 不匹配出现在^后面的任何一个字符 | [^asdf] | 不是a,s,d,f的任何一个 | |
边界 | ^ | 匹配行的开始,多行模式匹配模式时,可匹配任意行的开头 | ^Dear | 以Dear开头的字符串 |
$ | 匹配行的结束,如果最后是个换行符号,以这个换行符前面的字符为准,多行模式可以匹配任意行的结尾 | txt$ | 以txt结尾的字符串 | |
\b | 匹配单词边界 | \bthe\b | 匹配the,不匹配there或together | |
\A | 仅匹配整个字符串的开始,不支持多行模式 | \Aabc | 整个字符串以abc开头,匹配不上xyz\nabc | |
\Z | 仅匹配整个字符串的结束,不支持多行模式匹配 | def\Z | 整个字符串以def结尾,匹配不上def\nxyz | |
次数 | * | 前面的内容出现0次到多次 | 5* | 0个或多个5 |
+ | 前面的内容出现1次到多次 | a+ | 1个或多个a | |
? | 前面的内容出现0次或1次 | N? | 0个或1个N | |
{N} | 前面的内容出现N次 | X{5} | 5个X | |
{M,N} | 前面的内容出现M到N次 | W{2,5} | 2到5个W | |
非贪婪 | (次数)?,(*|+|?{})? | 次数后面加个问号表示非贪婪匹配,即找出长度最小且符合要求的 | “.+?” | 匹配引号引起来的部分,比如"a"b"c",如果左边的正则表达式中没有问号,则会贪婪匹配整个这个字符串。但左边的正则表达式中有问号,因此只会匹配上"a"和"c" |
子组 | (正则表达式) | 圆括号中匹配的内容会保存为子组(或称为子模式) | ([0-9]{3}) | 三个数字,构成一个子组 |
(?P…) | 命名的子组 | (?P\w+) | 子组名称为name | |
\子组编号 | 匹配以保存的子组,参考上面的(正则表达式) | (\w+)\1 | 两个词连续出现 | |
(?: ) | 虽然用括号括起来,但不算做子组 | (?:jilin | wuhan) university | jilin university 或 wuhan university | |
\ | 取消通配符特殊含义 | \. | 匹配字符.本身 |
常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global
表达式属性 | 说明 |
---|---|
Ignorecase | 默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 “大小写” 概念延伸至 UNICODE 范围的大小写。 |
Singleline | 默认情况下,小数点 “.” 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。 |
Multiline | 默认情况下,表达式 “^” 和 “KaTeX parse error: Undefined control sequence: \n at position 37: …置。如:①xxxxxxxxx②\̲n̲③xxxxxxxxx④配置为 …” 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。 |
Global | 主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。 |
参考文档:
揭开正则表达式的神秘面纱 http://www.regexlab.com/zh/regref.htm
《Django开发从入门到实践》