跳转至

正则表达式与通配符

在 GNU/Linux 操作系统中,正则表达式和通配符常使用相同的符号(或样式),因此人们非常容易混淆它们。

正则表达式和通配符有什么区别?

相同点:

  • 它们有相同的符号,但代表完全不同的含义。

不同点:

  • 正则表达式与文件内容匹配;通配符通常用于匹配文件名或目录名。
  • 正则表达式通常用于 grep、sed、awk 等命令。
  • 通配符通常与诸如 cp、find、mv、touch、ls 等命令一起使用。

GNU/Linux 中的通配符

GNU/Linux 操作系统支持这些通配符:

通配符样式 作用
? 匹配文件名或目录名的一个字符。
* 匹配文件名或目录名的 0 个或多个任意字符。
[ ] 匹配括号中的任何单个字符。 例如,[one] 表示匹配 o、n 或 e 。
[-] 匹配括号中给定范围内的任何单个字符。 例如,[0-9] 匹配 0 到 9 之间的任何单个数字。
[^] 单字符的 "逻辑非" 匹配。 例如,[^a-zA-Z] 表示匹配单个非字母字符。
{,} 多个单字符的非连续匹配。 用逗号分隔。
{..} 与 [-] 相同。 例如 {0..9} 和 {a..z}

不同的命令对通配符样式有不同的支持:

  • find:支持 *、?、[ ]、[-] 和 [^]
  • ls:全部支持
  • mkdir:支持 {,} 和 {..}
  • touch:支持 {,} 和 {..}
  • mv:全部支持
  • cp:全部支持

例如:

Shell > mkdir -p /root/dir{1..3}
Shell > cd /root/dir1/
Shell > touch file{1,5,9}
Shell > cd 
Shell > mv /root/dir1/file[1-9]  /root/dir2/
Shell > cp /root/dir2/file{1..9} /root/dir3/
Shell > find / -iname "dir[1-9]" -a -type d

GNU/Linux 中的正则表达式

由于历史发展的原因,正则表达式存在两个主要流派:

  • POSIX:
  • BRE(Basic Regular Express,基础正则表达式)
  • ERE(Extend Regular Express,扩展正则表达式)
  • POSIX character class
  • PCRE(Perl Compatible Regular Expressions):在各种编程语言中最常见。
BRE ERE POSIX character class PCRE
grep √ √
(需要 -E 选项)
√ √
(需要 -P 选项)
sed √ √
(需要 -r 选项)
√ ×
awk √ √ √ ×

欲了解更多有关正则表达式的内容,请访问 此网站 以获取更多有用的信息。

BRE

BRE(Basic Regular Express,基础正则表达式)是最古老的正则表达式类型,由 UNIX 系统中的 grep 命令和 ed 文本编辑器引入。

元字符 说明 bash 示例
* 匹配前一个字符的出现次数,可以是 0 或任意次数。
. 匹配除换行符之外的任何单个字符。
^ 匹配行开头。 例如 - ^h 将匹配以 h 开头的行。
$ 匹配行结尾。 例如 - h$ 将匹配以 h 结尾的行。
[] 匹配括号中指定的任意单个字符。 例如 - [who] 将匹配 w、h 或 o;[0-9] 将匹配一个数字;**[0-9][a-z]**将匹配由一个数字和一个小写字母组成的字符。
[^] 匹配除括号内字符之外的任何单个字符。 例如 - [^0-9] 将匹配任何单个非数字字符。 [^a-z] 将匹配除小写字母以外的任何单个字符。
\ 转义符,用于取消某些特殊符号所代表的含义。 echo -e "1.2\n122" \| grep -E '1\.2'
1.2
\{n\} 匹配前一个单字符的出现次数,n 表示匹配的次数。 echo -e "1994\n2000\n2222" \| grep "[24]\{4\}"
2222
\{n,\} 匹配前一个单字符至少出现 n 次。 echo -e "1994\n2000\n2222" \| grep "[29]\{2,\}"
1994
2222
\{n,m\} 匹配前面单字符至少 n 次且至多 m 次。 echo -e "abcd\n20\n300\n4444" \| grep "[0-9]\{2,4\}"
20
300
4444

ERE

元字符 说明 bash 示例
+ 匹配前一个单字符的出现次数,可以是1次或多次。 echo -e "abcd\nab\nabb\ncdd" \| grep -E "ab+"
abcd
ab
abb
? 匹配前一个单字符的出现次数,可以是 0 次或 1 次。 echo -e "ac\nabc\nadd" \| grep -E 'a?c'
ac
abc
\< 边界符,匹配字符串的开头。 echo -e "1\n12\n123\n1234" \| grep -E "\<123"
123
1234
\> 边界符,匹配字符串的结尾。 echo -e "export\nimport\nout" \| grep -E "port\>"
export
import
() 组合匹配,即将括号中的字符串作为组合,然后进行匹配。 echo -e "123abc\nabc123\na1b2c3" \| grep -E "([a-z][0-9])+"
abc123
a1b2c3
| 管道符表示 "或" 的含义。 echo -e "port\nimport\nexport\none123" \| grep -E "port\>\|123"
port
import
export
one123

ERE 还支持具有特殊含义的字符:

特殊字符 说明
\w 等同于 [a-zA-Z0-9]
\W 等同于 [^a-zA-Z0-9]
\d 等同于 [0-9]
\D 等同于 [^0-9]
\b 等同于 \< 或 \>
\B 匹配非边界符。
\s 匹配任何空白字符。 等同于 [ \f\n\r\t\v]
\S 等同于 [^ \f\n\r\t\v]
空白字符 说明
\f 匹配单个换页符。 等同于 \x0c 和 \cL
\n 匹配单个换行符。 等同于 \x0a 和 \cJ
\r 匹配单个回车符。 等同于 \x0d 和 \cM
\t 匹配单个制表符。 等同于 \x09 和 \cI
\v 匹配单个垂直制表符。 等同于 \x0b 和 \cK

POSIX 字符

有时,您可能会看到 "POSIX 字符"(也称为 "POSIX 字符类")。 请注意,作者很少使用 "POSIX 字符类",但为加深基础理解,特此包含了这一部分。

POSIX 字符 等同于
[:alnum:] [a-zA-Z0-9]
[:alpha:] [a-zA-Z]
[:lower:] [a-z]
[:upper:] [A-Z]
[:digit:] [0-9]
[:space:] [ \f\n\r\t\v]
[:graph:] [^ \f\n\r\t\v]
[:blank:] [ \t]
[:cntrl:] [\x00-\x1F\x7F]
[:print:] [\x20-\x7E]
[:punct:] [][!"#$%&'()*+,./:;<=>?@^_`{|}~-]
[:xdigit:] [A-Fa-f0-9]

在线练习

有许多网站可以供人们在线练习正则表达式技能,例如:

Author: tianci li