分分钟包学包会。
正则表达式是什么?
正则表达式,是一个表达式,用少量的简单字符,来表示复杂的长字符串。
实际工作用到很多,比如日志搜索、查找替换、JMeter 响应数据提取等。
先看一个例子,用户名包含字符、数字、下划线和连字符,并限制字符的个数:
这个表达式可以接受 john_doe、jo-hn_doe、john12_as,但是无法匹配到 Jo,因为它包含了大写的字母而且太短了。
字符匹配
正则表达式之所以强大,是因为通过一些特殊字符,能让它匹配到更多字符串。
.
匹配任意单个字符除了换行符。
例:.ar => The car parked in the garage.
[ ]
字符集。匹配方括号内的任意字符。并且字符是无先后顺序的。
例:[Tt]he => The car parked in the garage.
方括号的句号就表示句号。
例:ar[.] => A garage is a good place to park a car.
[^ ]
否定的字符集。匹配除了方括号里的任意字符。
例:[^c]ar => The car parked in the garage.
*
匹配 >= 0 个重复的在 * 号之前的字符。
例:a* => babaa123.
例:[a-z]* => The car parked in the garage #21.
* 字符和 . 字符搭配可以匹配所有的字符 .*。
+
匹配 >= 1个重复的 + 号前的字符。
例:c.+t => The fat cat sat on the mat.
?
标记 ? 之前的字符为可选,即出现 0 或 1 次。
例:[T]?he => The car is parked in the garage.
{n,m}
匹配 num 个大括号之前的字符或字符集 (n <= num <= m)。
例:[0-9]{2,3} => The number was 9.9997 but we rounded it off to 10.0.
可以省略第二个参数,表示至少。
例:[0-9]{2,} => The number was 9.9997 but we rounded it off to 10.0.
逗号也省略掉则表示重复固定的次数。
例:[0-9]{3} => The number was 9.9997 but we rounded it off to 10.0.
(xyz)
字符集,匹配与 xyz 完全相等的字符串,括号内的被视为一个整体。
JMeter 中,通过小括号来提取字符串中的子字符串。
例:"token":"(.*?)","expired_at" => "token":"123","expired_at"
|
或运算符,匹配符号前或后的字符。
例:"(T|t)he|car" => The car is parked in the garage.
^
字符串开头。
例:"^(T|t)he" => The car is parked in the garage.
$
字符串结尾。
例:"(at.)$" => The fat cat. sat. on the mat.
转义
对于正则表达式的这些特殊字符:
{ } [ ] ( ) / \ + * . $ ^ | ?
如果需要匹配,那么需要使用反斜杠 \ 进行转义。
例:"(f|c|m)at\.?" => The fat cat sat on the mat.
简写字符集
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字,等同于 [a-zA-Z0-9_],w是word首字母 |
\W | 匹配所有非字母数字,即符号,等同于: [^\w] |
\d | 匹配数字: [0-9],d是digital首字母 |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}],s是space首字母 |
\S | 匹配所有非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符 |
贪婪匹配与非贪婪匹配
正则表达式默认是贪婪匹配,也就是会尽可能多的匹配字符串。可以使用 ? 将贪婪匹配模式转化为非贪婪匹配模式。
例:
默认贪婪:
使用 ? 转为非贪婪:
忽略大小写
不同编程语言写法不同,比如 Python 可以通过 re.compile('pattern', re.I) 来忽略大小写。