乐趣区

关于正则表达式:5-分钟快速掌握-shell-中的正则表达式

本文首发于众里千寻 – 5 分钟疾速把握 shell 中的正则表达式

我常常会在命令行应用 grep 等命令解决一些文本查找的问题。在应用正则表达式的时候常常会碰到一些令人困惑的问题,比方同样的正则表达式在一个命令中能够用,在另一个命令中却不能够用。

明天咱们来好好整顿下 shell 中的正则表达式,这样在应用的时候可能驾轻就熟。

分类

正则表达式最早在 1950 年代由美国数学家 Stephen Cole Kleene 提出,起初被 Unix 操作系统的文本处理工具宽泛应用。

通过多年的倒退和实际,最终造成两大规范,一个是 POSIX 规范,另一个是 Perl 规范。后者本是为 Perl 语言实现的,因为其性能十分弱小,被 Java、JavaScript 等语言宽泛借鉴,从而被宽泛应用。

咱们这里将正则表达式分为三类:

  • 根本正则表达式(Basic Regular Expression 简称 BRE),由 POSIX 规范定义。
  • 扩大正则表达式(Extended Regular Expression 简称 ERE),也由 POSIX 规范定义。
  • Perl 的正则表达式(Perl Regular Expression 简称 PRE),由 Perl 语言定义。

组成部分

根本组成部分

下表展现了正则表达式的根本组成部分。

正则表达式 形容 示例 Basic RegEx Extended RegEx Perl regEx
\ 本义符,将特殊字符进行本义,疏忽其非凡意义 a.b 匹配 a.b,但不能匹配 ajb,. 被本义为非凡意义 \ \ \
^ 匹配行首 ^tux 匹配以 tux 结尾的行 ^ ^ ^
$ 匹配行尾 tux$ 匹配以 tux 结尾的行 $ $ $
. 匹配除换行符 \n 之外的任意单个字符 ab. 匹配 abc 或 bad,不可匹配 abcd 或 abde,只能匹配单字符 . . .
[] 匹配蕴含在 [字符] 之中的任意一个字符 coo[kl]能够匹配 cook 或 cool [] [] []
[^] 匹配 1 之外的任意一个字符 1232不能够匹配 1234 或 1235,1236、1237 都能够 [^] [^] [^]
[-] 匹配 [] 中指定范畴内的任意一个字符,要写成递增 [0-9]能够匹配 1、2 或 3 等其中任意一个数字 [-] [-] [-]
? 匹配之前的项 1 次或者 0 次 colou?r 能够匹配 color 或者 colour,不能匹配 colouur 不反对 ? ?
+ 匹配之前的项 1 次或者屡次 sa-6+ 匹配 sa-6、sa-666,不能匹配 sa- 不反对 + +
* 匹配之前的项 0 次或者屡次 co* l 匹配 cl、col、cool、coool 等 * * *
() 匹配表达式,创立一个用于匹配的子串 ma(tri)? 匹配 max 或 maxtrix 不反对 () ()
{n} 匹配之前的项 n 次,n 是能够为 0 的正整数 [0-9]{3}匹配任意一个三位数,能够扩大为 0 -9[0-9] 不反对 {n} {n}
{n,} 之前的项至多须要匹配 n 次 [0-9]{2,}匹配任意一个两位数或更多位数 不反对 {n,} {n,}
{n,m} 指定之前的项至多匹配 n 次,最多匹配 m 次,n<=m [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字 不反对 {n,m} {n,m}
| 交替匹配 | 两边的任意一项 ab(c|d)匹配 abc 或 abd 不反对 | |

POSIX 字符类

POSIX 字符类是一个形如 [:...:] 的非凡元序列(meta sequence),他能够用于匹配特定的字符范畴。

正则表达式 形容 示例 Basic RegEx Extended RegEx Perl RegEx
[:alnum:] 匹配任意一个字母或数字字符 [[:alnum:]]+ [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任意一个字母字符(包含大小写字母) [[:alpha:]]{4} [:alpha:] [:alpha:] [:alpha:]
[:blank:] 空格与制表符(横向和纵向) [[:blank:]]* [:blank:] [:blank:] [:blank:]
[:digit:] 匹配任意一个数字字符 [[:digit:]]? [:digit:] [:digit:] [:digit:]
[:lower:] 匹配小写字母 [[:lower:]]{5,} [:lower:] [:lower:] [:lower:]
[:upper:] 匹配大写字母 ([[:upper:]]+)? [:upper:] [:upper:] [:upper:]
[:punct:] 匹配标点符号 [[:punct:]] [:punct:] [:punct:] [:punct:]
[:space:] 匹配一个包含换行符、回车等在内的所有空白符 [[:space:]]+ [:space:] [:space:] [:space:]
[:graph:] 匹配任何一个能够看得见的且能够打印的字符 [[:graph:]] [:graph:] [:graph:] [:graph:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [[:xdigit:]]+ [:xdigit:] [:xdigit:] [:xdigit:]
[:cntrl:] 任何一个控制字符(ASCII 字符集中的前 32 个字符) [[:cntrl:]] [:cntrl:] [:cntrl:] [:cntrl:]
[:print:] 任何一个能够打印的字符 [[:print:]] [:print:] [:print:] [:print:]

元字符

元字符(meta character)是一种 Perl 格调的正则表达式,只有一部分文本处理工具反对它,并不是所有的文本处理工具都反对。

正则表达式 形容 示例 Basic RegEx Extended RegEx Perl RegEx
\b 单词边界 \bcool\b 匹配 cool,不匹配 coolant \b \b \b
\B 非单词边界 cool\B 匹配 coolant,不匹配 cool \B \B \B
\d 单个数字字符 b\db 匹配 b2b,不匹配 bcb 不反对 不反对 \d
\D 单个非数字字符 b\Db 匹配 bcb,不匹配 b2b 不反对 不反对 \D
\w 单个单词字符(字母、数字与_) \w 匹配 1 或 a,不匹配 & \w \w \w
\W 单个非单词字符 \W 匹配 &,不匹配 1 或 a \W \W \W
\n 换行符 \n 匹配一个新行 不反对 不反对 \n
\s 单个空白字符 x\sx 匹配 x x,不匹配 xx 不反对 不反对 \s
\S 单个非空白字符 x\S\x 匹配 xkx,不匹配 xx 不反对 不反对 \S
\r 回车 \r 匹配回车 不反对 不反对 \r
\t 横向制表符 \t 匹配一个横向制表符 不反对 不反对 \t
\v 垂直制表符 \v 匹配一个垂直制表符 不反对 不反对 \v
\f 换页符 \f 匹配一个换页符 不反对 不反对 \f

常见命令中的应用

命令 Basic RegEx Extended RegEx Perl RegEx
grep 反对 需加 -E 参数 需加 -P 参数
egrep 反对 反对 需加 -P 参数
sed 反对 需加 -r 参数 不反对
awk 反对 反对 不反对

常见面试知识点、技术解决方案、教程,都能够扫码关注公众号“众里千寻”获取,或者来这里 https://everfind.github.io。


  1. 字符 ↩
  2. 45 ↩
退出移动版