正则表达式
正则表达式
为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
发展历史
正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
正则表达式的使用
//文本test内容如下
[root@yqh ~]# cat test
Here are the books that you requested
Yes, it is a good book for children
It is amzing to think that it was called a "harmful book" when
once you get to the end of the book, you can't believe
当将星号和通配符元字符(.)结合起来使用时,可以匹配任意字符的零次或多次出现。在前面的示例中,可以像下面这样编写比较完整的正则表达式:
[root@yqh ~]# grep ' book.\? ' test
n和m是0到255之间的整数。如果只指定{n}本身,那么将精确匹配前面的字符或正则表达式的n次出现。如果指定{n, m},那么就匹配出现的次数为n和m之间的任意数。
\{n,m\}
这对元字符对于匹配固定长度字段中的数据非常有用,数据可能是从数据库中提前的,它也用于匹配格式化数据,例如电话号码,U.S社会保险号,库存零件ID等等。例如,社会保险号的格式为:3个数字,一个连字符,再跟2个数字,一个连字符,然后是4个数字。可以描述为一下模式:
[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}
取出正确的电话号码:
//文本telephone内容如下
[root@yqh ~]# cat telephone
111111
1-11111
11-111111
027-88055638
027-87520208
0027-17386331124
[root@yqh ~]# grep -E '[0-9]{3,4}-[0-9]{8,11}' telephone
027-88055638
027-87520208
0027-17386331124
分组操作
圆括号()用于对正则表达式进行分组并设置优先级。它们是元字符扩展集的一部分。假设在文本文件中将公司的名称为"BigOne"或"BigOne Computer",使用表达式:
BigOne( Computer)?
将匹配字符串“BigOne”本身或后面跟有一个字符串“Computer”的形式。同样,有些术语有时会用全拼,有时会用缩写、则可以使用:
[root@yqh ~]# cat mail.list
Bell Laboratories, Lucent Technologies
Bell Labs
[root@yqh ~]# egrep "Lab(oratorie)?s" mail.list
可以使用竖线和圆括号来对选择性操作进行分组。在下面的示列中,我们使用它来指定与单词“company”的单数或复数匹配。
compan(y|ies)
要注意,在大多数sed和grep的版本中不能对加圆括号的一组字符应用数量词,但是在egrep和awk的所有版本中都是可以的。