正则
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开来的,后来在广泛运用于Scala 、PHP、C# 、Java、C++ 、Objective-c、Perl 、Swift、VBScript 、Javascript、Ruby 以及Python等等。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
正则转义符
元符号-转义号\\
在使用正则表达式时去检索某些特殊字符的时候需要用到转义符。
正则表达式所支持的合法字符
字符 | 解释 |
---|---|
X | 字符x(x 可代表任何合法的字符) |
\0mnn | 八进制数 0mnn 所表示的字符 |
\xhh | 十六进制值 0xhh 所表示的字符 |
\uhhhh | 十六进制值 0xhhhh 所表示的 Unicode 字符 |
\t | 制表符(“\u0009”) |
\n | 新行(换行)符(‘\u000A’) |
\r | 回车符(‘\u000D’) |
\f | 换页符(‘\u000C’) |
\a | 报警(bell)符(‘\u0007’) |
\e | Escape 符(‘\u001B’) |
\cx | x 对应的的控制符。例如,\cM匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。 |
正则表达式中的特殊字符
特殊字符 说明 |
---|
$ 匹配一行的结尾。要匹配 $ 字符本身,请使用$ |
^ 匹配一行的开头。要匹配 ^ 字符本身,请使用^ |
() 标记子表达式的开始和结束位置。要匹配这些字符,请使用(和) |
[] 用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用[和] |
{} 用于标记前面子表达式的出现频度。要匹配这些字符,请使用 {和} |
* 指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用* |
+ 指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用+ |
? 指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用? |
. 匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用. |
\ 用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\ |
| 指定两项之间任选一项。如果要匹配丨字符本身,请使用\ |
预定义字符
预定义字符 | 说明 |
---|---|
. | 可以匹配任何字符 |
\d | 匹配 0~9 的所有数字 |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 |
\S | 匹配所有的非空白字符 |
\w | 匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_ |
\W | 匹配所有的非单词字符 |
\bword \b | \b 标注字符的边界(全字匹配) |
正向预查
判断条件(?=pattern)正向肯定查看 查询任何匹配pattern处前的一些内容
判断条件(?!pattern)正向否定查看 查询任何不匹配pattern处前的一些内容
反向预查
(?<=pattern)判断条件 反向肯定查看 查询任何匹配pattern后边的内容
(?<!pattern)判读条件 反向否定查看 查询任何不匹配pattern后边的内容
否定字符类(^)
[^ \n\v\t\:\(\)\%\.\/\-\<\>\_\=] ##排除这些以外的所有字符
举例子
限定符(Quantifier)
a* a出现0次或多次
a+ a出现1次或多次
a? a出现0次或1次
a{6} a出现6次
a{2,6} a 出现2-6次
a{2,} a出现2次以上
或运算符
(a|b) 匹配a或b
(ab)|(cd) 匹配ab或者cd
字符类
[abc] 匹配a或者b或者c
[a-c] 匹配a或者b或者c
[a-zA-Z0-9] 匹配小写大写英文字符以及数字
[^0-9]匹配非数字字符
贪婪/懒惰匹配
<.+>默认贪婪匹配 “任意字符”
<.+?>懒惰匹配 “任意字符”
练习
格式练习
匹配IP地址
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b
邮箱地址:
\D[a-z]+\@+\D[a-z]+\.
正确格式:example@example.com
错误格式:example@.com, example@example, @example.com
字符串由 6 到 12 个字母和数字组成:
/[a-z0-9]{6,12}
正确格式:abc123, 12345678, abcdefg
错误格式:abc, 1234567890123, abc!123
HTML 文档中的链接:
\w{4,5}+\:+\/\/|(\w+\.){2}+\w{3}
^(https?://)?(www\\.)?[a-zA-Z0-9-]+(\\.[a-zA-Z]{2,})+(/[^\\s]*)?$
<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1
<a href="http://www.example.com">Example</a>
日期(YYYY-MM-DD):
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])
正确格式:2021-01-01, 1990-12-31
错误格式:2021/01/01, 01-01-2021, 2021-13-01
字符串由至少一个大写字母、一个小写字母和一个数字组成:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$
正确格式:Abc123, Xyz456, Abc123xyz
错误格式:abc123, ABCXYZ, 123456
手机号码(XXX-XXXX-XXXX):
^\d{3}-\d{4}-\d{4}$
正确格式:123-4567-8901, 987-6543-2109
错误格式:12345678901, 123-456-7890, 123-4567-89012
字符串由至少一个字母、一个数字和一个特殊字符组成:
^(?=(.*[a-z|A-Z]))(.*\d)(.*[!@#$%^&*])$
正确格式:Abc123!, Xyz456@, Abc123!@#
错误格式:abc123, 123456, ABCXYZ
身份证号码(中国的身份证号码格式):
^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\d{4}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}(\d|X)$
正确格式:110101199001011234, 310101199001012345
错误格式:123456789012345678, 11010119900101X123
字符串由至少一个字母和一个数字组成,且长度为 8 到 10 个字符:
`^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8,10}$`
正确格式:abc12345, xyz987654, abc123xyz
错误格式:abc, 1234567890, abc!123xyz
URL:
^(https?://)?(www\\.)?[a-zA-Z0-9-]+(\\.[a-zA-Z]{2,})+(/[^\\s]*)?$
正确格式:https://www.example.com, http://www.example.com, www.example.com
错误格式:example.com, http://example, www.example
日志正则分析
August 18th 2023,11:01:44.007 10.136.132.109 <190>Aug 18 2023 03:01:43+08:00 JLQ-P-POD6-FW-HW-E8000EX16-01-ITC21 %%01INF0/6/LOGFILE_DELETED(s)[13038815]:The log fle cfcard2:/1g/2023-07-23.10-41-48.1og.zipis deleted successfully.
这是一段防火墙日志首先要进行分割
August 18th 2023,11:01:44.007 时间
10.136.132.109 IP
Aug 18 2023 03:01:43+08:00 日志产生时间
JLQ-P-POD6-FW-HW-E8000EX16-01-ITC21 主机名称
%%01INF0/6/LOGFILE_DELETED(s) 事件名称
[13038815] 进程号
:The log fle cfcard2:/1g/2023-07-23.10-41-48.1og.zipis deleted successfully. 内容
时间
^\w{3,9}\s\d{2}\w{2}\s\d{4}\W(\d{2}:){2}\d{2}\.\d{1,}
IP
(\d{1,3}\.){3}\d{1,3}
产生时间
\w{3}\s\d{2}\s\d{4}\s(\d{2}:){2}\d{2}\+\d{2}:\d{2}
主机名称
\w{1,}-){5}(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{1,}-\d{1,}-(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]{1,}
(?<=\d{2} )\w+(-\w{1,}){7}
事件名称
[^ \n\t\v\[\:]+(?=\[\d{8}\])
进程号
(\[\d{1,}\])
内容
(?<=\[\d{8}\]:)[^\n\t\v]+
(?<=\[\d{8}\]:)[\w\d\s\S]+
例2
August 18th 2023,10:45:07.783 10.221.74.234 <185>Aug 18 02:45:08 2023 5JLQ-P-PUB-CMNETFW-H3C-M9016-01-ITC11 %%10DIAG/1/CORE_EXCEED_THRESHOLD: -DevIP=10.221.74.234-Chassis=1-Slot=8.1; Usage of CPU1core 18 exceeded the threshold (95%).
August 18th 2023,10:45:07.783
[^\n\t\v]+(?= \d{2}.\d{3}\.)
10.221.74.234
[^ \n\t\v\:]+(?= \<\d{3}\>)
<185>Aug 18 02:45:08 2023
(?<= \<\d{3}\>)[A-Za-z]+\s\d+\s(\d{2}:){2}\d{2}\s\d{4}
5JLQ-P-PUB-CMNETFW-H3C-M9016-01-ITC11
[^ \n\v\t\:\=\.](\w{1,}-){7}\w+
%%10DIAG/1/CORE_EXCEED_THRESHOLD:
[^ \n\v\t]+(?=\: )
-DevIP=10.221.74.234-Chassis=1-Slot=8.1; Usage of CPU1core 18 exceeded the threshold (95%).
(?<=\: )[^\n\v\t]+