Skip to content

6-2 正则表达式

[!quote] 正则表达式 正则表达式 是构成搜索模式的字符序列,可以使搜索更强大

模式

范围

  • [] 字符集合
`[abc]` 查找方括号之间的任何字符

  • ^ 排除
`[^abc]` 可以匹配 `plain` 中的 `plin`

  • - 区间
`[0-9]` 查找任何从 0 至 9 的数字

  • () 整体
`gr(a|e)y` 等价于 `gray|grey`
`(grand)?father` 匹配 `father` 和 `grandfather`

  • | 选择
`(x|y)` 查找 x 或 y

量词

  • ? 表示前面的字符最多出现一次
`colou?r` ,可以匹配 `color` 或者 `colour`

  • {n} 前面的字符出现 n 次
`o{2}` 不能匹配 `Bob` 中的 `o`,但是能匹配 `food` 中的两个 `o`

  • {n,} 前面的字符至少出现 n 次
`o{2,}` 不能匹配 `Bob` 中的 `o`,但能匹配 `foooood` 中的所有 `o`。
`o{1,}` o 至少出现一次
`o{0,}` o 可以出现任意次(包括0次)

  • {n,m} 最少匹配 n 次,且最多匹配 m 次
`o{1,3}` 将匹配 `fooooood` 中的前三个 `o`

其他

  • \ 转义字符
`n` 匹配字符 `n`
`\n` 匹配一个换行符
`\\` 匹配 `\`
`\(` 匹配 `(`

  • ^ 位于正则表达式的开始位置时,匹配输入字符串的开始位置
`^abc` 匹配所有以 "abc" 开头的字符串,"abc"、"abcdefg"、"abc123" ……

  • $ 位于正则表达式的结束位置时,匹配输入字符串的结束位置
`abc$` 匹配所有以 "abc" 结尾的字符串,"123abc"、"xyzabc"……

  • 其他限制符?? 紧跟在任何一个其他限制符【*+?{n}{n,}{n,m}】后面时,会使用非贪婪的匹配模式

[!quote] 非贪婪模式

  • 非贪婪模式:尽可能少的匹配所搜索的字符串
  • 贪婪模式:尽可能多的匹配所搜索的字符串【默认】

对于字符串 oooo

  • o+? 将匹配单个 o
  • o+ 将匹配所有 o

  • . 匹配除 之外的任何单个字符

[!hint] 要匹配包括 在内的任何字符,使用 (.|\n)

特殊符号

  • [:alnum:] 英文大小写字母及数字,亦即 0-9,A-Z,a-z
  • [:alpha:] 任何英文大小写字母,亦即 A-Z,a-z
  • [:cntrl:] 键盘上面的控制按键,亦即包括 CR,LF,Tab,Del...
  • [:digit:] 数字【0-9】
  • [:blank:] 空格键与 Tab 键
  • [:space:] 任何会产生空白的字符,包括空格键,[Tab],CR ……
  • [:graph:] 除了空格键,和 Tab 键 外的其他所有按键
  • [:lower:] 小写字母
  • [:upper:] 大写字母
  • [:print:] 任何可以被列印出来的字符
  • [:punct:] 标点符号【:",',?,!,;,:,#,$ ……】
  • [:xdigit:] 16 进位的数字类型,因此包括: 0-9,A-F,a-f 的数字与字节
# 将匹配所有的数字
echo '1234\nabcd' | grep '[[:digit:]]'

优先级

优先级从上到下,从左到右,依次降低

运算符说明
\转义符
()(?:)(?=)[]括号和中括号
*+?{n}{n,}{n,m}限定符
^$\ 任何元字符定位点和序列
选择