表达式是由字符组成的字符串。那些具有超出其字面意义的解释的字符被称为 元字符。例如,引号可以表示人的言语、同上,或者对于后面的符号具有元意义 [1]。正则表达式是匹配(或指定)模式的字符和/或元字符的集合。
正则表达式包含以下一项或多项
字符集。这些是保留其字面意义的字符。最简单的正则表达式类型仅由字符集组成,不包含元字符。
锚点。这些指定 (锚定) 正则表达式要匹配的文本行中的位置。例如,^ 和 $ 是锚点。
修饰符。这些扩展或缩小 (修改) 正则表达式要匹配的文本范围。修饰符包括星号、方括号和反斜杠。
正则表达式 (RE) 的主要用途是文本搜索和字符串操作。正则表达式 匹配 单个字符或一组字符——一个字符串或字符串的一部分。
星号——* ——匹配其前面的字符、字符串或正则表达式的任意次数重复,包括 零 次。
"1133*" 匹配11 + 一个或多个 3: 113, 1133, 1133333等等。
点 —— . ——匹配任何一个字符,除了换行符。[2]
"13." 匹配13 + 至少一个任意字符(包括空格): 1133, 11333,但不匹配13(缺少额外的字符)。
有关 点单字符 匹配的演示,请参见 示例 16-18。
美元符号 —— $ ——在正则表达式的末尾匹配行的结尾。
"XXX$" 匹配行尾的 XXX。
"^$" 匹配空行。
方括号 —— [...] ——将一组字符括起来,以便在单个正则表达式中匹配。
"[xyz]" 匹配以下字符中的任何一个x, y,或z.
"[c-n]" 匹配以下范围内的任何一个字符c到n.
"[B-Pk-y]" 匹配以下范围内的任何一个字符B到P和k到y.
"[a-z0-9]" 匹配任何单个小写字母或任何数字。
"[^b-d]" 匹配 除了 以下范围内的字符之外的任何字符b到d。这是 ^ 否定或反转以下正则表达式含义的一个实例(作用类似于不同上下文中的 !)。
方括号字符的组合序列匹配常见的单词模式。"[Yy][Ee][Ss]" 匹配yes, Yes, YES, yEs等等。"[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" 匹配任何社会安全号码。
反斜杠 —— \ ——转义 特殊字符,这意味着该字符被解释为字面意义(因此不再是 特殊 的)。
"\$" 恢复为其字面意义 "$",而不是其正则表达式含义行尾。同样,"\\" 具有 "\" 的字面意义。
转义的 “尖括号” —— \<...\> ——标记单词边界。
尖括号必须转义,因为否则它们只有其字面字符含义。
"\<the\>" 匹配单词 “the”,但不匹配单词 “them”、“there”、“other” 等。
bash$ cat textfile This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. This is line 4. bash$ grep 'the' textfile This is line 1, of which there is only one instance. This is the only instance of line 2. This is line 3, another line. bash$ grep '\<the\>' textfile This is the only instance of line 2. |
问号 —— ? ——匹配前一个正则表达式的零个或一个。它通常用于匹配单个字符。
加号 —— + ——匹配前一个正则表达式的一个或多个。它的作用类似于 *,但不匹配零次出现。
# GNU versions of sed and awk can use "+", # but it needs to be escaped. echo a111b | sed -ne '/a1\+b/p' echo a111b | grep 'a1\+b' echo a111b | gawk '/a1+b/' # All of above are equivalent. # Thanks, S.C. |
转义的 “花括号” —— \{ \} ——指示要匹配的前一个正则表达式的出现次数。
必须转义花括号,因为否则它们只有其字面字符含义。从技术上讲,此用法不是基本正则表达式集的一部分。
"[0-9]\{5\}" 完全匹配五个数字(0 到 9 范围内的字符)。
![]() | 花括号在 awk 的 “经典”(非 POSIX 兼容)版本中不可用作正则表达式。但是,GNU 扩展版本的 awk,gawk,具有--re-interval选项,该选项允许它们(无需转义)。
Perl 和某些 egrep 版本不需要转义花括号。 |
—— | ——“或” 正则表达式运算符匹配一组备用字符中的任何一个。
bash$ egrep 're(a|e)d' misc.txt People who read seem to be better informed than those who do not. The clarinet produces sound by the vibration of its reed. |
![]() | sed、ed 和 ex 的某些版本支持上面描述的扩展正则表达式的转义版本,GNU 实用程序也支持。 |
这是指定要匹配的字符范围的另一种方法。
[:alnum:]匹配字母数字字符。这等效于A-Za-z0-9.
[:alpha:]匹配字母字符。这等效于A-Za-z.
[:blank:]匹配空格或制表符。
[:cntrl:]匹配控制字符。
[:digit:]匹配(十进制)数字。这等效于0-9.
[:graph:](图形可打印字符)。匹配 ASCII 33 - 126 范围内的字符。这与[:print:](下文)相同,但不包括空格字符。
[:lower:]匹配小写字母字符。这等效于a-z.
[:print:](可打印字符)。匹配 ASCII 32 - 126 范围内的字符。这与[:graph:](上文)相同,但添加了空格字符。
[:upper:]匹配大写字母字符。这等效于A-Z.
[:xdigit:]匹配十六进制数字。这等效于0-9A-Fa-f.
![]() | POSIX 字符类通常需要引用或 双括号 ([[ ]])。 |
bash$ grep [[:digit:]] test.file abc=723 |
# ... if [[ $arow =~ [[:digit:]] ]] # Numerical input? then # POSIX char class if [[ $acol =~ [[:alpha:]] ]] # Number followed by a letter? Illegal! # ... # From ktour.sh example script. |
这些字符类甚至可以在有限的程度上与 globbing 一起使用。
bash$ ls -l ?[[:digit:]][[:digit:]]? -rw-rw-r-- 1 bozo bozo 0 Aug 21 14:47 a33b |
Sed、awk 和 Perl 用作脚本中的过滤器时,在“筛选”或转换文件或 I/O 流时,将正则表达式作为参数。有关此的说明,请参见 示例 A-12 和 示例 A-16。
关于这个复杂主题的标准参考是 Friedl 的 精通正则表达式。 Dougherty 和 Robbins 的 Sed & Awk 也对正则表达式进行了非常清晰的阐述。有关这些书的更多信息,请参见 书目。
[1] | 元意义 是术语或表达式在更高抽象层次上的含义。例如,正则表达式 的 字面 意思是符合公认用法的普通表达式。元意义 则截然不同,本章对此进行了详细讨论。 | |
[2] | 由于 sed、awk 和 grep 处理单行,因此通常不会有换行符来匹配。在多行表达式中存在换行符的情况下,点将匹配换行符。
|