正则表达式
@think3r
2022-11-02 16:58:29
0x00 语法
0.0 模式
要表示一个模式至少应该包含以下信息 :
- 字符类( Character Class) : 如x和y, 它们在模式中表示一个字符, 但是取值范围是一类字符中的任意一个。
- 数量限定符( Quantifier) : 邮件地址的每一部分可以有 一个或多个 x 字符, IP 地址的每一部分可以有 1-3 个 y 字符
- 各种字符类以及普通字符之间的位置关系: 例如邮件地址分三部分, 用普通字符 @ 和 . 隔开, IP 地址分四部分, 用 . 隔开, 每一部分都可以用字符类和数量限定符描述。
- 为了表示位置关系, 还有位置限定符( Anchor) 的概念
规定一些特殊语法表示字符类、 数量限定符和位置关系, 然后用这些特殊语法和普通字符一起表示一个模式, 这就是正则表达式( Regular Expression)。
0.1 字符类
字符 |
含义 |
example |
. |
匹配任意一个字符 |
abc. 可以匹配 abcd 、 abc9 等 |
[] |
匹配括号中的任意一个字符 |
[abc]d 可以匹配 ad 、 bd 或 cd |
- |
在 [] 括号内表示字符范围 |
[0-9a-fA-F] 可以匹配一位十六进制数字 |
^ |
位于 [] 括号内的开头, 匹配除括号中的字符之外的任意一个字符 |
[^xy] 匹配除 xy 之外的任一字符, 因此 [^xy]1 可以匹配 a1 、 b1 但不匹配 x1 、 y1 |
[[:xxx:]] |
grep 工具预定义的一些命名字符类 |
[[:alpha:]] 匹配一个字母,[[:digit:]] 匹配一个数字 |
0.2 数量限定符
字段 |
含义 |
example |
? |
紧跟在它前面的单元应匹配零次或一次 |
[0-9]?\.[0-9] 匹配 0.0 、 2.3 、 .5 等, 由于 . 在正则表达式中是一个特殊字符, 所以需要用 \ 转义一下, 取字面值 |
+ |
紧跟在它前面的单元应匹配一次或多次 |
[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+ 匹配 email 地址 |
* |
紧跟在它前面的单元应匹配零次或多次 |
[0-9][0-9]* 匹配至少一位数字, 等价于 [0-9]+ , [a-zA-Z_]+[a-zA-Z_0-9]* 匹配 C 语言的标识符 |
{0} |
紧跟在它前面的单元应精确匹配 N 次 |
[1-9][0-9]{2} 匹配从 100 到 999 的整数 |
{N,} |
紧跟在它前面的单元应匹配至少 N 次 |
[1-9][0-9]{2,} 匹配三位以上( 含三位) 的整数 |
{,M} |
紧跟在它前面的单元应匹配最多 M 次 |
[0-9]{,1} 相当于 [0-9]? |
{N,M} |
紧跟在它前面的单元应匹配至少 N 次,最多 M 次 |
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 匹配 IP 地址 |
0.3 位置限定符
<
为 <
小于的转义
>
为 >
大于的转义
|
为 |
管道符的转义
字段 |
含义 |
example |
^ |
匹配行首的位置 |
^Content 匹配位于一行开头的 Content |
$ |
匹配行末的位置 |
;$ 匹配位于一行结尾的 ; 号, ^$ 匹配空行 |
\< |
匹配单词开头的位置 |
\<th 匹配 ... this , 但不匹配 ethernet 、 tenth |
\> |
匹配单词结尾的位置 |
p\> 匹配 leap ... , 但不匹配 parent 、 sleepy |
\b |
匹配单词开头或结尾的位置 |
\bat\b 匹配 ... at ... , 但不匹配 cat 、 atexit 、 batc |
\B |
匹配非单词开头和结尾的位置 |
\Bat\B 匹配 battery , 但不匹配 ... attend 、 hat |
0.4 其它特殊字符
字段 |
含义 |
example |
\ |
转义字符, 普通字符转义为特殊字符, 特殊字符转义为普通字符 |
普通字符 < 写成 \< 表示单词开头的位置, 特殊字符 . 写成 . 以及 \ 写成 \ 就当作普通字符来匹配 |
() |
将正则表达式的一部分括起来组成一个单元, 可以对整个单元使用数量限定符 |
([0-9]{1,3}\.){3}[0-9]{1,3} 匹配 IP 地址 |
| |
连接两个子表达式, 表示或的关系 |
n(o|either) 匹配 no 或 neither |
0.5 模糊匹配
字段 |
含义 |
\d |
匹配一个数字(digit) |
\D |
匹配一个非数字 |
\w |
匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
\W |
匹配非字母且也是非数字的情况 |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 。注意 Unicode 正则表达式会匹配全角空格符。 |
\S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
[\s\S] |
匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行 |
0x01 测试文件及命令
egrep
相当于 grep -E
, 表示采用 Extended 正则表达式语法
grep
的正则表达式有 Basic 和 Extended 两种规范
- C 语言的正则支持 :
#include <regex.h>
egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' testfile
- 注意 grep 找的是包含某一模式的行, 而不是完全匹配某一模式的行。
- 进阶 :
^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$
'^([0-9]{1,3}\.){3}[0-9]{1,3}'
(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
192.168.1.1
1234.234.04.5678
123.4234.045.678
abcde
no
neither
n-o