文章摘要
GPT 4
此内容根据文章生成,仅用于文章内容的解释与总结。

正则表达式

需要注意

普通字符(包含大小写字母和数字)和元字符(存在特殊含义)组成

无论普通字符还是元字符,都区分大小写的!

基本正则表达式

元字符 作用
* 匹配一个字符匹配0次或任意多次
等价于{0,}
如:z* 会匹配前面一个字符含z的行
. 匹配除了换行符外任意一个字符
^ 匹配行首
如:^hello会匹配以hello开头的行
$ 匹配行尾
如:hello$会匹配以hello结尾的行
[] 匹配中括号中指定的任意一个字符,只匹配一个字符
如: [aoeiu]匹配意一个元音字母
[0-9]匹配任意一位数字
[a-z][0-9]匹配小写字和一位数字构成的两位字符
[^] 匹配除中括号的字符以外的任意一个字符
如: [^0-9]匹配任意一位非数字字符
[^a-z]表示任意一位非小写字母
\ 转义符
用于取消特殊符号的含义
\{n\} 表示其前面的字符恰好出现n次
如: [0-9]\{4\}匹配4位数字
[1][3-9][0-9]\{9\}匹配手机号码
\{n,\} 表示其前面的字符出现不小于n次
例如: [0-9]\{2,\}表示两位及以上的数字
\{n,m\} 表示其前面的字符至少出现n次最多出现m次
如: [a-z]\{6,8\}匹配6到8位的小写字母

扩展正则表达式

扩展元字符 作用
+ 前一个字符匹配1次或任意多次
等价于{1,}
go+gle会匹配goglegooglegooogle
当然如果o有更多个,也能匹配
? 前一个字符匹配0次或1次
等价于{0,1}
colou?r可以匹配colourcolor
` `
( ) 匹配其整体为一个字符,即模式单元
可以理解为由多个单字符组成的大字符

(dog)+会匹配dogdogdogdogdogdog等,
因为被( )包含的字符会当成一个整体
但`hello (world

POSIX字符簇

是一个通用且形如 [:…:] 的特殊元序列(meta sequence),用于匹配特定的字符范围。

POSIX 元字符 相当于 作用
[:alnum:] [0-9a-zA-Z] 匹配字母和数字字符
[:digit:] [0-9] 匹配数字字符
[:alpha:] [a-zA-Z] 匹配字母字符
[:lower:] [a-z] 匹配小写字母字符
[:upper:] [A-Z] 匹配大写字母字符
[:cntrl:] 匹配控制字符
[:graph:] 匹配可打印字符(除了空格)
[:space:] TAB 匹配空白字符
包括空格、制表符、换行符等
[:blank:] 匹配空格和制表符字符

运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

  • 相同优先级的正则表达式从左到右进行运算
  • 不同优先级的正则表达式运算先高后低
运算符 描述
\ 转义符
( ) (?:)(?=) [] 圆括号和方括号
* 表示匹配零次到多次
+ * ?{n} {n,} {n,m} 限定符
^ $ \任何元字符、任何字符 定位点和序列
即:位置和顺序)
| 替换, 字符具有高于替换运算符的优先级
即:`m

匹配规则

基本模式匹配

模式是正则表示式最基本的元素,它是一组描述字符串特征的字符集,用于匹配字符串。

举例

  • ^love 匹配的是以love开头的字符串
  • man$ 匹配的是以 man 结尾的字符串
  • ^bash$ 仅匹配bash这个字符串(精确匹配)
  • ^\t 标识匹配以 制表符 为开头的字符串(这里需要用到转移符)
    • 同理,\n为新的一行,\r为回车

字符簇匹配

在程序中,要判断输入的电话号码、邮件地址等是否有效,用上述规则匹配显然是无法满足的;因此需要使用相应的字符模式的方法来描述,它就是字符簇。

举例

  • [a-z] 匹配所有的小写字母
  • [A-Z] 匹配所有的大写字母
  • [^$]排除空行
  • ^[ - ]?[0-9]+(\.[0-9]+)?$ 取所有的浮点数
  • POSIX字符簇
  • 正则表达式的组合应用

规则提取

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,在文件中全局查找 指定的正则表达式,并打印所有包含该表达式的行。

如何理解

就像你在Windows中用记事本打开*.txt文件,通过Ctrl + F 在文本中查找某个字符串一样

孪生兄弟

  • grep 支持基本正则表达式

  • egrep 支持扩展正则表达式,相当于grep -E

  • fgrep 不支持正则表达式,只能匹配写死的字符串(但是速度奇快且效率高)

使用说明

基本语法:grep [选项] [模式] 文件名

说明

  • 选项:用于控制grep的行为
  • 模式:正则表达式模式
  • 文件:要搜索的文件的列表

选项

选项 说明
-i 在搜索的时候忽略大小写
-n 显示结果所在行号
-c 统计匹配到的行数
注意:是匹配到的总行数,不是匹配到的次数
-o 只显示符合条件的字符串
即:每个符合条件的字符串单独显示一行
-v 输出不带匹配内容的行
反向查询(反向匹配)
-w 匹配整个单词
如果字符串中包含这个单词,则不作匹配
-A 行数 在输出的时候包含结果所在行之后的指定行数
(A=After,之后)
-B行数 在输出的时候包含结果所在行之前的指定行数
(B=Before,之前)
-C 行数 在输出的时候包含结果所在行之前和之后的指定行数
(C=Content,上下文)
-e 实现多个选项的匹配
-q 静默模式,不输出任何信息
使用 echo $? 查看是否匹配;0 表示匹配到,1表示没有匹配到
-E 使用扩展正则表达式
相当于使用egrep
-–color=auto 表示对匹配到的文本着色显示
也可直接用--color选项

退出状态码

grep操作完成后,其退出状态有特殊含义,如下所示。

  • 找到匹配的表达式 0

  • 没找到匹配的表达式 1

  • 找不到指定文件 2

基本用法

这里创建一段特定文本(命名为regex),内容如下。

1
2
3
4
5
6
7
8
world hello
sayhello
hellosay
shell : root
class : shell
weclome to shell World
10,2023
saY shell

搜索包含shell的行

1
grep "shell" regex

image-20231025122521431

搜索仅行首包含shell的行

1
grep "^shell" regex

image-20231025122535166

搜索仅行尾包含shell的行

1
grep "shell$" regex

image-20231025122547146

搜索仅包含shell的行

1
grep "^shell$" regex

image-20231025122628051

锚定词首为 hello 的行

1
grep "\<hello" regex

image-20231025122641592

锚定词尾为 hello 的行

1
grep "hello\>" regex

image-20231025122655665

锚定词为 hello 的行

1
grep "\<hello\>" regex

image-20231025122706587

搜索包含字符 y 的行(忽略大小写)

1
grep -i "y" regex

image-20231025122912516

扩展说明

grep一般结合基本正则表达式使用;同时, 每一类正则表达式本身的表达式是需要用户去写的,但表达式的元字符都有着固定的或者特定的意义,可以根据需要去理解或组合字符。

结合正则表达式

元字符 描述
[:digit:][0-9] 匹配任意单个字符
[:lower:] [a-z] 匹配任意单个小写字母
[:upper:][A-Z] 匹配任意单个大写字母
[:alpha:][a-zA-Z] 匹配任意单个大写字母或小写字母
[:alnum:][0-9a-zA-Z] 匹配任意单个字母或数字

结合特定模式

元字符 描述
^ 锚定行首
$ 锚定行尾
. 匹配任意一个字符
* 匹配零个或多个字符
\? 匹配其前面的字符0次或者1次
\+ 匹配其前面的字符1次或者多次
\{m\} 匹配其前面的字符m次(\为转义符)
\{m,n\} 匹配其前面的字符至少m次,至多n次
[] 匹配一个指定范围内的字符
[^]匹配指定范围外的任意单个字符 (排除)
\<\b 锚定词首
使用 \<匹配对象\>可做精确匹配
\>\b 锚定词尾
使用 \<匹配对象\>可做精确匹配
\(\) 将多个字符当做一个整体进行处理
\1 模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配的内容
\2 模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容
\w 所有的字母与数字,称为字符[a-zA-Z0-9]
\W 所有字母与数字之外的字符,称为非字符 [^a-zA-Z0-9]
.* 匹配任意长度的任意字符

💡提示

  • 其中\1\2 是后向引用,引用前面的分组括号中的模式所匹配到的字符

  • 在某行文本的检查中,如果使用\(\)则分组括号中的模式匹配到的某内容可以被引用