对话 UNIX,第 9 部分: 正则表达式( 三 )
可实现这一技巧 。regex 操作符 |(竖线)表示备选项,因此 this|that 匹配字符串 this 或字符串 that 。因此,^(bat|Bat|cat|Cat) 表示“行首紧跟 bat、Bat、cat 或 Cat之一 。当然,可以使用 grep -i 来简化该 regex,这样可以忽略大小写,从而将命令简化为:
grep -i -E '^(bat|cat)' heroes.txt
匹配“bat、“Bat、“cat或“Cat的另一个方法是使用 [ ](方括号)集合 操作符 。如果将一组字符放在一个集合中,则可以匹配那些字符中的任意一个 。(您可以将集合 看作是字符备选项的简写法 。)
例如,命令行:
grep -E '^[bcBC]at' heroes.txt
与以下命令生成的结果相同:
grep -E '^(bat|Bat|cat|Cat)' heroes.txt
您可以再次使用 -i 将 regex 简化为 ^[bc]at 。
而且,还可以使用 -(连字符)操作符在集合中指定包含的字符范围 。例如,用户名通常以字母开头 。假定要在提交给您的服务器的 Web 表格中验证这样的用户名,可以使用类似于 ^[A-Za-z] 的 regex 。此 regex 表示“字符串的开头后紧跟任意大写字母 (A-Z) 或任意小写字母 (a-z) 。顺便说明一下,[A-z] 与 [A-Za-z] 作用相同 。
还可以在集合中混合使用范围和单个字符 。regex [A-MXYZ] 将匹配任意大写的 A-M、X、Y 和 Z 。
并且,如果希望反转集合(即排除集合中的任意字符),可以使用特殊集合 [^ ] 并包含要排除的范围或字符 。以下是反转集合的示例 。要查找所有名称中包含 at 的超级英雄,并排除 Dark Knight 和 Batman,请键入:
grep -i -E '[^b]at' heroes.txt
此命令生成:
Catwoman
Black Cat
由于某些集合需要经常使用,所以设计出简化符号以代替大量字符 。例如,集合 [A-z0-9_] 十分常用,因此可以简写为 w 。与此类似,操作符 W 是集合 [^A-z0-9_] 的简写 。还可以使用符号 [:alnum:] 代替 w,使用 [^[:alnum:]] 代替 W 。
顺便说明一下,w(以及同义词 [:alnum:])是特定于区域的,而 [A-z0-9_] 即表示字母 A-z、数字 0-9 和下划线 。如果要开发国际化应用程序,请使用区域特定的格式以使代码可以在许多区域之间移植 。
跟我一起重复:重复,重复,重复
到目前为止,已经介绍了字面值、位置和两种备选项操作符 。仅使用这些内容,就可以匹配大多数具有可预测 长度的模式 。现在回到用户名,通过以下 regex 命令可以确保每个用户名以字母开头并紧跟恰好七个字母或数字:
[a-z][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]
但是这样有点笨拙 。而且,它只匹配恰好八个字符的用户名 。它不会匹配三到八个字符之间的名称,这通常也是有效的用户名 。
正则表达式还可以包括重复修饰符 。重复修饰符可以指定数量,如没有、一个、多个、一个或多个,零或一个、五到十个,以及恰好三个 。重复修饰符必须与其他模式组合,修饰符本身没有含义 。
例如,regex:
^[A-z][A-z0-9]{2,7}$
可以实现前面描述的用户名过滤功能 。用户名 是以字母开头,后面紧跟至少两个,但不超过七个字母或数字的字符串,并且紧跟字符串结尾 。
此处的位置定位点非常重要 。如果没有两个位置操作符,则会错误地接受任意长度的用户名 。为什么呢?请考虑 regex:
^[A-z][A-z0-9]{2,7}
此命令辨别:字符串是否以字母开头并紧跟二到七个字母?但是它未提到终止条件 。因此,字符串 samuelclemens 满足条件,但是它的长度显然超出了有效用户名的范围 。与此类似,省略开始定位点 ^,或同时省略两个定位点将分别匹配以类似 munster1313 结束或包含该字符串的字符串 。如果必须匹配特定的长度,请记得在要求的模式的开头和结尾分别加上分隔符 。
推荐阅读
- 对话 UNIX,第 6 部分: 通过脚本实现操作的自动化
- 提升UNIX中文件系统使用效率
- SCO UNIX基础讲座--第十一讲:TCP/IP 管理
- 什么是第二人格
- 基本配置及操作 SCO UNIX学习宝典
- SCOUNIX基础讲座--第八讲:监视进程管理
- Stty使用技巧一则
- SCO UNIX 5.0.4 DAT磁带机安装
- 初识夏新M350——外观第一感
- UNIX操作系统的版本与标准