正则表达式 是字符串搜索与匹配的神器。
正则表达式最初起源并不是计算机科学家的成果,而是自动控制理论和形式语言的研究者开始提出并使用的。
最早将正则表达式引入计算机领域的是 肯·汤普逊,即 UNIX 的联合创始人。随着 UNIX 的流行和 Linux
的诞生,正则表达式被广泛应用到各种类 UNIX 系统和工具中。熟悉 Linux 命令的人都知道 Linux
有个查找字符串的神器指令:grep
。
如今,正则表达式已经无孔不入了,无论是程序员还是用户,都经常接触正则表达式,比如手机输入法,比如 Windows 里面的文件搜索
,比如 Linux 的 ls
,网站的登录和注册等等。
在用户注册验证的常见 3
种实现思路中,都用到了正则表达式,这也就是说各种编程语言都支持正则表达式。
前面写过 Ajax 登录验证时使用到了正则表达式,但是只是简单是使用了几句正则表达式,使用到的 PHP 正则函数就一个 preg_match()
,而非系统的理论学习。现在将学习 正则表达式的基本语法 比较全面地总结一下。
不过,能不用正则的情况,尽量不用正则
界定符
表示一个正则表达式的开始和结束,通常有 3 种界定符:/.../
、 #...#
、{...}
。
一般使用最多的是 /.../
,比如:/[0-9a-zA-Z]/
。
原子
原子分为可见原子
和不可见原子
。
可见原子
指的是 Unicode
编码表中用键盘输出后 肉眼可见 的字符。主要有:
- 标点符号:
"
、_
、?
等。 - 英文字母和数字。
- 汉字、英语和其他语言文字。
这些可见原子在进行正则匹配的时候不能直接使用实际的语言词汇,而是要转换成 Unicode
编码。
- 数理化公式符号。等其他可见字符。
不可见原子
指的是 Unicode 编码表中用键盘输出后 肉眼不可见 的字符。主要有:
- 换行符
\n
- 回车符
\r
- 制表符
\t
- 空格。等其他不可见符号。
原子的集合
.
:匹配除换行符之外的任意字符。\d
:匹配任意一个十进制数字,即[0-9]
。\D
:匹配任意一个非十进制数字,即[^0-9]
。\s
:匹配一个不可见原子,即[\f\n\r\t\v]
。\S
:匹配一个可见原子,即[^\f\n\r\t\v]
。\w
:匹配任意一个数字、字母或下划线,即[0-9a-zA-Z]
。\W
:匹配任意一个非数字、字母或下划线,即[0-9a-zA-Z]
。
元字符
元字符指定了原子的筛选方式。主要有:
|
:匹配两个或者多个分支选择。[]
:匹配方括号中的任意一个原子。[^]
:匹配除方括号中的原子之外的任意字符。
量词
{n}
:表示其前面的原子恰好出现n
次。{n,}
:表示其前面的原子最少出现n
次{n, m}
:表示其前面的原子最少出现n
次最出m
次。*
: 匹配 0 次、1 次 或者多次其之前的原 子 , 即{ 0, }
。+
:匹配 1 次或者多次其之前的原子,即{ 1, }
。?
:匹配 0 次或者 1 次其之前的原子,即{ 0, 1 }
边界控制
^
:匹配字符串开始的位置。$
: 匹配字符串结束的位置。()
:匹配其中的整体为一个原子。
模式单元
总模式
每个 pattern
可以看作是一个总模式。
子模式
pattern
的每个模式单元 (...
) 称为子模式,包含在总模式中。
常见修正模式
U
:懒惰匹配,即是:只匹配最近的一个字符串,不重复匹配。i
:忽略英文字母大小写。x
:忽略空白。s
:让元字符 . 匹配包括换行符在内所有字符,即将字符串视为单行,换行符作为普通字符。e
:e 配合函数preg_replace()
使用, 可以把匹配来的字符串当作正则表达式执行D
:如果使用$
限制结尾字符,则不允许结尾有换行。A
:强制从目标字符串开头匹配。m
:将字符串视为多行,不管是那行都能匹配。g
:表示全局匹配。
贪婪匹配
匹配结果存在歧义时取其长。
懒惰匹配
匹配结果存在歧义时取其短。