前言
文章同步于我的个人博客https://quan9i.github.io/zhengze/#more中,欢迎大家访问
近期在学习web命令执行时由于正则表达式不是太理解而影响了刷题速度,因此来对正则进行复习来加强对其相关知识的理解
匹配字符串[ ]
[ ]中的字母可以匹配到后面的字符组中,例如要匹配大小写的python,可以如下表达
[Pp]ython
具体示例如下:
可见python和Python都可以被检测出来
区间[ ]
如果想表示很多数字或者多个字母,可以用-来表示,例如[1,2,3,4,5,6,7,8,9]可以用[1-9]来表示
具体示例如下
匹配特殊符号
正则表达使用了 - 号代表了区间,但是我们有时候需要匹配的符号就是 -号,该怎么办呢?
这个时候我们需要对-号进行转义操作,即 \-。
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 \-,即 \- 就代表了 - 号本身。
偷偷告诉你,转义符 \ 也适用于其他的符号,例如匹配圆括号可以使用 \(
转自编程胶囊
具体示例如下
方法一:正向思考
观察匹配的字符,用\来防止被转义,构造payload如下
[\[\-\(]
//最外层的[]代表的是固定格式,然后从左往右看,\[代表匹配[,\-代表匹配-,\(代表匹配(
执行结果如下
方法二:排除法
不想匹配到的数字和字符,我们可以用^来避免匹配这些,,从而达到目的,payload如下
[^0-9 A-Z a-z].*
//.代表除换行符之外的所有字符,*表示匹配零次或多次
//^ 在方括号表达式中使用时,它表示不接受该字符集合。
执行结果
对于^的讲解
n[^e] 的意思就是n后面的字母不能为 e。
示例如下
快捷匹配数字和字母
快捷方式 描述
\w 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
\d 与任意数字匹配
具体示例如下
\s 可以匹配空白字符,比如空格,tab、换行等。
\b 匹配的是单词的边界
^与$
^指定的是一个字符串的开始
$指定的是一个字符串的结束
具体示例如下
可选字符?
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选
这意味着正则表达式引擎将会期望该字符出现零次或一次。
具体示例如下
对于payload的解释
favo.?rite
//.代表除换行符的一切,?表示匹配除去前面字符的其他字符0次或1次
那.?在这里的含义就是favo再匹配除换行的一切
.?的示例:
重复
在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
对于payload的解释
\d{3}-\d{5}
\d{3}表示字符串长度为3
\d{5}表示字符串长度为5
两个连到一起,意思是第一个长度为3,第二个长度为5
重复区间
语法:{M,N},M是下界而N是上界。
具体示例如下
开闭区间
闭区间不写即可表示匹配一个或无数个。
+等价于{1,},*等价于{0,}
具体示例
总结
多种匹配模式
实例 描述
[Pp]ython 匹配 “Python” 或 “python”。
rub[ye] 匹配 “ruby” 或 “rube”。
[abcdef] 匹配中括号内的任意一个字母。
[0-9] 匹配任何数字。类似于 [0123456789]。
[a-z] 匹配任何小写字母。
[A-Z] 匹配任何大写字母。
[a-zA-Z0-9] 匹配任何字母及数字。
[^au] 除了au字母以外的所有字符。
[^0-9] 匹配除了数字外的字符。
实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
? 匹配一个字符零次或一次,另一个作用是非贪婪模式
+ 匹配1次或多次
* 匹配0次或多次
\b 匹配一个长度为0的子串
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
\b 匹配一个长度为0的子串