听说过正则表达式的人都知道正则表达式能用来匹配、查找、替换文本,不管怎样,我们一定使用过简单的正则表达式
例如,我们在 Windows 里里面使用 问号(?)和 星号()通配符来查找硬盘上的文件,知道问号(?) 可以代表文件名中的单个字符,而星号()可以表示任意数量的字符
像 data?.dat 这样的模式将查找下列文件:
data1.dat
data2.dat
datax.dat
dataN.dat
使用 * 字符代替 ? 字符可以扩大查找范文,data*.dat 匹配下列所有文件:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
这种方法很有用,因为简单易记,完成查找文件这种工作绰绰有余了
像 data*.dat 和 data?.dat 这样的字符串就是正则表达式,但正则表达式不止于此
正则表达式功能强大,而且更加灵活,可以通过简单的办法来实现强大的功能
比如下图这个正则表达式
匹配以 任意数量数字开头的以 abc 结尾的字符串
^ 匹配开头,意思是字符串要从行首开始,且第一个字符就是数字 (0到9任意)
[0-9]+ 匹配多个数字: [0-9] 匹配单个数字,+ 表示前面的数字出现一次以上
abc 表示匹配 abc 三个字符
$ 匹配结尾,表示字符串要此结尾(可能是一行结束或者文本结束 abc$ 匹配以 abc 结尾
匹配以数字开头,并以 abc 结尾的字符串
var str = "456xyz";
var patt1 = /^[0-9]+xyz$/;
document.write(str.match(patt1));
匹配的结果如下
456xyz
各种开发语言的字符串数据类型通常都提供了简单的查找和替换能力,但这种查找替换要给予确定的查找字符,比如只能一次查找 food 而不能一次查找以 f 或 g 开头的以 ood 结尾的 food 或 good。
但我们日常开发中却迫切希望能一次性查找出所有 food 或者 good。这时候正则表达式就孕育而生了。
正则表达式而已使用 (f|d)ood 一次性找出所有 food 或 good 单词,可以用 1\d{10} 找出所有的手机号
这就是正则表达式,它的能力就是这么强大
通常来说,有了正则表达式,我们可以:
测试字符串内的模式
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证
替换文本
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它
基于模式匹配从字符串中提取子字符串
可以查找文档内或输入域内特定的文本
例如,我们可能需要搜索整个网站,删除过时的材料,以及替换某些 html 格式标记,在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记,将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件,然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记
正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究
Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念
正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人
正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器
剩下的历史,就众所周知了,从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分
目前,正则表达式已经在很多软件中得到广泛的应用,包括 *nix(Linux, Unix等)、HP 等操作系统,php、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子
下表列出了流行的开发语言或工具对正则表达式语法的支持情况
命令或环境 | . | [ ] | ^ | $ | ( ) | { } | ? | + | | | ( ) |
---|---|---|---|---|---|---|---|---|---|---|
vi | √ | √ | √ | √ | √ | |||||
Visual C++ | √ | √ | √ | √ | √ | |||||
awk | √ | √ | √ | √ | 在命令行加入 --posix --re-interval 提供支持 | √ | √ | √ | √ | |
sed | √ | √ | √ | √ | √ | √ | ||||
delphi | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
Python | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
Java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
JavaScript | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
PHP | √ | √ | √ | √ | √ | |||||
Perl | √ | √ | √ | √ | √ | √ | √ | √ | √ | |
C# | √ | √ | √ | √ | √ | √ | √ | √ |