正则表达式基础

正则表达式就是由一系列特殊字符组成的字符串,简称RE(Regular Expression)。其中每个特殊字符都被称为元字符, 这些元字符并不表示为它们字面上的含义, 而会被解释为一些特定的含义。
正则表达式是由普通字符和元字符共同组成的集合, 这个集合用来匹配(或指定)模式
正则表达式的主要功能是文本查询和字符串操作,正则表达式可以匹配文本的一个字符或字符集合。
a、b、1、2等字符属于普通字符,普通字符可以按照字面意思理解,如:a只能理解为英文的小写字母a,没有其他隐藏含义。
而*、^、[]等元字符,Shell赋予了它们超越字面意思的意义,如:*符号的字面意义只是一个符号,而实际上却表示了重复前面的字符0次或多次的隐藏含义。

一个正则表达式包含下列一项或多项: ^linux*
一个字符集. 这里所指的字符集只包含普通字符, 这些字符只表示它们的字面含义. 正则表达式的最简单形式就是只包含字符集, 而不包含元字符.
锚. 锚指定了正则表达式所要匹配的文本在文本行中所处的位置. 比如, ^, 和$就是锚.
修饰符. 它们扩大或缩小(修改)了正则表达式匹配文本的范围. 修饰符包含星号, 括号, 和反斜杠.

符号意义
*0个或多个在*字符之前那个普通字符
.匹配任意Y一个字符
^匹配行首,或后面字符的非
$匹配行尾
[]匹配字符集合
\转义符,屏蔽一个元字符的特殊意义
\<\>精确匹配符号
\{n\}匹配前面字符出现n次
\{n,\}匹配前面字符至少出现n次
\{n,m\}匹配前面字符出现n次与m次之间

符号用于匹配前面一个普通字符的0次或多次重复 helo: 符号前面的普通字符是l,字符就表示匹配l字符0次或多次,如字符串helo、hello、hellllllo,heo都可以由hel*o来表示
.符号用于匹配任意一个字符

模式含义匹配示例不匹配示例
c.tc + 任意1字符 + tcat, cut, c+t, c2tct (缺1字符),cart (多1字符)
a..ba + 任意2字符 + ba12b, a+_b, a bab (缺字符),a123b (多字符)
...任意3个字符abc, 123, a bab (只有2个)
^...$整行正好3字符cat, dog, 123cats (4字符)


^符号用于匹配行首,表示行首的字符是^字符后面的那个字符
^cloud表示匹配以cloud开头的行

位置含义示例说明
^ 在模式开头行首^abc匹配以abc开头的行
^ 在 [^ 里排除[^abc]匹配不是a/b/c的字符


$符号匹配行尾,$符号放在匹配字符之后

abc$ # 匹配以 “abc” 结尾的行 [0-9]$ # 匹配以数字结尾的行 ^$ # 匹配空行(行首紧接着行尾)

示例说明:

模式含义匹配的行
hello$以hello结尾“say hello”, “hello”
\.txt$以.txt结尾“file.txt”, “data.txt”
[0-9]$以数字结尾“page1”, “item2”
^$空行什么都没有的行

对比 ^ 和 $

符号位置含义示例
^放在模式开头匹配行首^start
$放在模式结尾匹配行尾end$


micky$表示匹配以micky结尾的所有行
^$ 表示空白行

[]匹配字符的一个集合,在RE中, 将匹配中括号字符集中的某一个字符
“[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]” 可以匹配社保码
举例:grep “[^a-z]” exp2.txt

反斜杠 \ 的核心作用

反斜杠用来”脱掉”特殊字符的特殊外衣,让它们回归字面含义

1. 转义特殊字符

\$      # 匹配字符"$"(不是行尾)
\^      # 匹配字符"^"(不是行首)
\.      # 匹配字符"."(不是任意字符)
\*      # 匹配字符"*"(不是重复)
\\      # 匹配字符"\"(反斜杠本身)

2. 给普通字符赋予特殊含义

\<      # 单词开头边界
\>      # 单词结尾边界
\b      # 单词边界(有些版本)
\B      # 非单词边界

转义尖括号 \<...\> 详解

\<the\>   # 精确匹配单词"the"
          # 匹配:the
          # 不匹配:them, there, other, theater

大括号 \{\} 重复次数

模式含义示例匹配
\{n\}恰好n次JO\{3\}BJOOOB
\{n,\}至少n次JO\{3,\}BJOOOB, JOOOOB, JOOOOOB
\{n,m\}n到m次JO\{3,6\}BJOOOB(3), JOOOOB(4), JOOOOOB(5), JOOOOOOB(6)
[a-z]\{5\}5个小写字母[a-z]\{5\}hello, house, world

例子解析

grep "\<iivey\>" exp1.txt

这条命令的含义:

  • \< – 单词开头边界
  • iivey – 要匹配的单词
  • \> – 单词结尾边界
  • 整体:精确匹配单词 “iivey”

更多例子

# 匹配恰好3个数字
grep "[0-9]\{3\}" file.txt

# 匹配至少2个大写字母
grep "[A-Z]\{2,\}" file.txt

# 匹配2-4个重复的o
grep "o\{2,4\}" file.txt

# 匹配完整的单词"hello"
grep "\<hello\>" file.txt

# 匹配句号(转义)
grep "\." file.txt

  1. 反斜杠 = 脱掉特殊外衣,回归字面
  2. 转义尖括号 = 赋予单词边界含义
  3. 大括号 = 控制重复次数

扩展正则元字符详解

元字符名称含义示例匹配不匹配
?问号匹配前面字符0次或1次colou?rcolor, colourcolouur
+加号匹配前面字符至少1次fe+elfeel, feeelfel
()圆括号分组(ab)+ab, ababa, b
|竖线或操作cat|dogcat, dogcatdog

POSIX字符类

为了保持不同国家的字符编码的一致性,POSIX(Portable Operating System Interface)增加了特殊的字符类,以[:classname]的格式给出,grep命令支持POSIX字符类,

类名意义等价于示例匹配不匹配
[:upper:]大写字母[A-Z][[:upper:]]A, Z, FOOa, z, 123
[:lower:]小写字母[a-z][[:lower:]]a, z, helloA, Z, 123
[:digit:]阿拉伯数字[0-9][[:digit:]]0, 5, 9a, Z, @
[:alnum:]字母和数字[0-9a-zA-Z][[:alnum:]]a, Z, 9@, !, 空格
[:space:]空白字符空格、Tab等[[:space:]]空格, \t字母, 数字
[:alpha:]大小写字母[a-zA-Z][[:alpha:]]a, Z, Hello9, @, 空格
[:cntrl:]控制字符ASCII 0-31[[:cntrl:]]Ctrl+A, Ctrl+Ba, 1, @
[:graph:]可见字符ASCII 33-126[[:graph:]]a, Z, 9, @, !空格, Tab
[:print:]可打印字符可见字符+空格[[:print:]]a, Z, 9, 空格控制字符
[:xdigit:]十六进制数字[0-9A-Fa-f][[:xdigit:]]0, 5, A, F, bG, Z, 7 (非十六进制

通配

通配(globbing)是把一个包含通配符的非具体文件名扩展到存储在计算机、服务器或者网络上的一批具体文件名的过程
最常用的通配符包括正则表达式元字符:?、*、[]、{}、^等,通配符与元字符意义不完全相同:
*符号不再表示其前面字符的重复,而是表示任意位的任意字符
?字符表示一位的任意字符
^符号在通配中不代表行首,而是代表取反意义

通配符 vs 正则表达式 核心区别

符号通配符 (globbing)正则表达式 (regex)
*任意长度的任意字符前一个字符重复0次或多次
?单个任意字符前一个字符重复0次或1次(ERE)
[]匹配括号内任一字符匹配括号内任一字符
{}匹配花括号内任一字符串分组
^在[]开头表示取反行首 或 在[]内取反

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注