正则表达式学习笔记

正则表达式 是字符串搜索与匹配的神器。

正则表达式最初起源并不是计算机科学家的成果,而是自动控制理论和形式语言的研究者开始提出并使用的。

最早将正则表达式引入计算机领域的是 肯·汤普逊,即 UNIX 的联合创始人。随着 UNIX 的流行和 Linux 的诞生,正则表达式被广泛应用到各种类 UNIX 系统和工具中。熟悉 Linux 命令的人都知道 Linux 有个查找字符串的神器指令:grep

如今,正则表达式已经无孔不入了,无论是程序员还是用户,都经常接触正则表达式,比如手机输入法,比如 Windows 里面的文件搜索,比如 Linux 的 ls,网站的登录和注册等等。

在用户注册验证的常见 3 种实现思路中,都用到了正则表达式,这也就是说各种编程语言都支持正则表达式。

前面写过 Ajax 登录验证时使用到了正则表达式,但是只是简单是使用了几句正则表达式,使用到的 PHP 正则函数就一个 preg_match(),而非系统的理论学习。现在将学习 正则表达式的基本语法 比较全面地总结一下。

  • 界定符

表示一个正则表达式的开始和结束,通常有 3 种界定符:/.../#...#{...}

一般使用最多的是 /.../,比如:/[0-9a-zA-Z]/

  • 原子

原子分为可见原子和不可见原子。

可见原子

指的是 Unicode 编码表中用键盘输出后 肉眼可见 的字符。主要有:

1、 标点符号: "_? 等。

2、 英文字母和数字。

3、 汉字、英语和其他语言文字。

这些可见原子在进行正则匹配的时候不能直接使用实际的语言词汇,而是要转换成 Unicode 编码。

4、 数理化公式符号。等其他可见字符。

不可见原子

指的是 Unicode 编码表中用键盘输出后 肉眼不可见 的字符。主要有:

1、 换行符 \n

2、 回车符 \r

3、 制表符 \t

4、 空格。等其他不可见符号。

原子的集合

1、 .:匹配除换行符之外的任意字符。

2、 \d:匹配任意一个十进制数字,即 [0-9]。

3、 \D:匹配任意一个非十进制数字,即 [^0-9]。

4、 \s:匹配一个不可见原子,即 [\f\n\r\t\v]。

5、\S:匹配一个可见原子,即 [^\f\n\r\t\v]。

6、 \w:匹配任意一个数字、字母或下划线,即 [0-9a-zA-Z] 。

7、 \W:匹配任意一个非数字、字母或下划线,即 [0-9a-zA-Z] 。

  • 元字符

元字符指定了原子的筛选方式。主要有:

1、 |:匹配两个或者多个分支选择。

2、 []:匹配方括号中的任意一个原子。

3、 [^]:匹配除方括号中的原子之外的任意字符。

  • 量词

1、 {n}:表示其前面的原子恰好出现 n 次。

2、 {n,}:表示其前面的原子最少出现 n 次

3、 {n, m}:表示其前面的原子最少出现 n 次最出 m 次。

4、 *: 匹配 0 次、1 次 或者多次其之前的原子 , 即 { 0, } 。

5、 +:匹配 1 次或者多次其之前的原子,即 { 1, } 。

6、 ?:匹配 0 次或者 1 次其之前的原子,即 { 0, 1 } 。

  • 边界控制

1、 ^:匹配字符串开始的位置。

2、 $: 匹配字符串结束的位置。

3、 ():匹配其中的整体为一个原子。

  • 模式单元

1、 总模式

每个 pattern 可以看作是一个总模式。

2、 子模式

pattern 的每个模式单元 (...) 称为子模式,包含在总模式中。

  • 常见修正模式

1、 U:懒惰匹配,即是:只匹配最近的一个字符串,不重复匹配。

2、 i:忽略英文字母大小写。

3、 x:忽略空白。

4、 s:让元字符 . 匹配包括换行符在内所有字符,即将字符串视为单行,换行符作为普通字符。

5、 e:e 配合函数 preg_replace() 使用, 可以把匹配来的字符串当作正则表达式执行。

6、 D:如果使用 $ 限制结尾字符,则不允许结尾有换行。

7、 A:强制从目标字符串开头匹配。

8、 m:将字符串视为多行,不管是那行都能匹配。

9、 g:表示全局匹配。

贪婪匹配

匹配结果存在歧义时取其长。

懒惰匹配

匹配结果存在歧义时取其短。

正则应用实例

今天刚好需要将代码中的注释和多余空行清除掉的情况,就写了几个蹩脚的正则:

(//)(.)*

^(\n)*

^(/\*)(.|\n)*(\*/){1}$    <==>    ^(/\*)((.)*(\n){1})*(\*/){1}$

(/\*).*(\*/){1}$

[)]{1}(\n){1}[{]  => ) {

参考资料和工具

本文最后修改时间: 2015年10月21日 10:00:12 (完) CC BY-NC-ND 3.0

若您发现文章中的错误,并愿告知于我,或想与我交流,我的联系方式在: Contacts


上一篇 用 JQuery 实现 Ajax

All The Best

下一篇 关于 Javascript 跨域问题