正则表达式

@think3r 2022-11-02 16:58:29

0x00 语法

0.0 模式

要表示一个模式至少应该包含以下信息 :

  1. 字符类( Character Class) : 如x和y, 它们在模式中表示一个字符, 但是取值范围是一类字符中的任意一个。
  2. 数量限定符( Quantifier) : 邮件地址的每一部分可以有 一个或多个 x 字符, IP 地址的每一部分可以有 1-3 个 y 字符
  3. 各种字符类以及普通字符之间的位置关系: 例如邮件地址分三部分, 用普通字符 @ 和 . 隔开, IP 地址分四部分, 用 . 隔开, 每一部分都可以用字符类和数量限定符描述。
    • 为了表示位置关系, 还有位置限定符( Anchor) 的概念

规定一些特殊语法表示字符类、 数量限定符和位置关系, 然后用这些特殊语法和普通字符一起表示一个模式, 这就是正则表达式( Regular Expression)。

0.1 字符类

字符 含义 example
. 匹配任意一个字符 abc. 可以匹配 abcdabc9
[] 匹配括号中的任意一个字符 [abc]d 可以匹配 adbdcd
- [] 括号内表示字符范围 [0-9a-fA-F] 可以匹配一位十六进制数字
^ 位于 [] 括号内的开头, 匹配除括号中的字符之外的任意一个字符 [^xy] 匹配除 xy 之外的任一字符, 因此 [^xy]1 可以匹配 a1b1 但不匹配 x1y1
[[:xxx:]] grep 工具预定义的一些命名字符类 [[:alpha:]] 匹配一个字母,[[:digit:]] 匹配一个数字

0.2 数量限定符

字段 含义 example
? 紧跟在它前面的单元应匹配零次或一次 [0-9]?\.[0-9] 匹配 0.02.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} 匹配从 100999 的整数
{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 位置限定符

  • &lt< 小于的转义
  • &gt> 大于的转义
  • &#124;| 管道符的转义
字段 含义 example
^ 匹配行首的位置 ^Content 匹配位于一行开头的 Content
$ 匹配行末的位置 ;$ 匹配位于一行结尾的 ; 号, ^$ 匹配空行
\< 匹配单词开头的位置 \&lt;th 匹配 ... this , 但不匹配 ethernettenth
\> 匹配单词结尾的位置 p\&gt; 匹配 leap ... , 但不匹配 parentsleepy
\b 匹配单词开头或结尾的位置 \bat\b 匹配 ... at ... , 但不匹配 catatexitbatc
\B 匹配非单词开头和结尾的位置 \Bat\B 匹配 battery , 但不匹配 ... attendhat

0.4 其它特殊字符

字段 含义 example
\ 转义字符, 普通字符转义为特殊字符, 特殊字符转义为普通字符 普通字符 < 写成 \< 表示单词开头的位置, 特殊字符 . 写成 . 以及 \ 写成 \ 就当作普通字符来匹配
() 将正则表达式的一部分括起来组成一个单元, 可以对整个单元使用数量限定符 ([0-9]{1,3}\.){3}[0-9]{1,3} 匹配 IP 地址
&#124; 连接两个子表达式, 表示或的关系 n(o|either) 匹配 noneither

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