正则表达式小笔记
正则表达式
需要注意
由普通字符(包含大小写字母和数字)和元字符(存在特殊含义)组成
无论普通字符还是元字符,都区分大小写的!
基本正则表达式
元字符 | 作用 |
---|---|
* |
匹配前一个字符匹配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 会匹配gogle 、google 或gooogle ,当然如果 o 有更多个,也能匹配 |
? |
前一个字符匹配0次或1次 等价于{0,1} 如 colou?r 可以匹配colour 或color |
` | ` |
( ) |
匹配其整体为一个字符,即模式单元 可以理解为由多个单字符组成的大字符 如 (dog)+ 会匹配dog 、dogdog 、dogdogdog 等,因为被 ( ) 包含的字符会当成一个整体但`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 |
搜索仅行首包含shell
的行
1 | grep "^shell" regex |
搜索仅行尾包含shell
的行
1 | grep "shell$" regex |
搜索仅包含shell
的行
1 | grep "^shell$" regex |
锚定词首为 hello
的行
1 | grep "\<hello" regex |
锚定词尾为 hello
的行
1 | grep "hello\>" regex |
锚定词为 hello
的行
1 | grep "\<hello\>" regex |
搜索包含字符 y
的行(忽略大小写)
1 | grep -i "y" regex |
扩展说明
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
是后向引用,引用前面的分组括号中的模式所匹配到的字符在某行文本的检查中,如果使用
\(\)
则分组括号中的模式匹配到的某内容可以被引用