文本处理
正则表达式

一、正则表达式基础认知

(一)定义与用途

正则表达式是一种用于对字符串进行操作、实现文本模式匹配的逻辑公式。在实际编程和文本处理工作中,它的应用场景非常广泛:

文本匹配和搜索:可以快速找到文本中符合特定模式的内容。比如在一篇文章里搜索所有的电子邮件地址、电话号码、日期等信息。

数据验证:用于检查输入的数据是否符合规定的格式。像验证用户注册时输入的密码强度、用户名是否遵循特定规则等。

数据清洗和处理:帮助从大量文本数据中删除无用字符,提取关键信息。例如处理网页数据时,去除 HTML 标签,只保留文本内容。

日志分析和处理:在系统日志中,通过正则表达式可以进行告警收敛、统计访问量等操作。比如统计某个时间段内特定 IP 的访问次数。

(二)常见正则表达式示例

IP 地址:(\d{1,3}){3}\d{1,3},它表示的模式是由 3 组 1 - 3 个数字,中间用点号分隔,最后再加上 1 - 3 个数字 。例如192.168.1.1就符合这个模式。

身份证号:^\d{17}(\d|x|X)$|^\d{15}$,代表 17 个数字后面跟着 1 个数字或者 x(X),或者直接是 15 个数字 。像11010519491231002X就是一个合法的身份证号。

日期格式:\d{4}-\d{1,2}-\d{1,2},匹配的是类似2023 - 05 - 15这样的日期格式,4 位年份,中间用短横线连接 1 - 2 位的月份和 1 - 2 位的日期。

电子邮箱:^([a - z0 - 9_-]+)@([\da - z-]+)\.([a - z]{2,6})$,用于匹配电子邮箱地址,比如example123@domain.com。它的组成部分包括用户名(由小写字母、数字、下划线、减号组成),然后是 @符号,接着是域名(由数字、字母、减号组成),最后是由 2 - 6 个小写字母组成的顶级域名 。

电话号码:\d{3}-\d{8}|\d{4}-\d{7},可以匹配像010 - 12345678或020 - 1234567这样的电话号码格式。

手机号码:1\d{10},表示以 1 开头,后面跟着 10 个数字,例如13800138000 。

二、正则表达式基础符号

匹配任意字符串:使用.符号。比如a.b可以匹配aabacb等,只要中间是任意一个字符都能匹配。

字符集合:[abc]等价于a|b|c,表示匹配a、b、c中的任意一个字符 。[a - z]则等价于从a到z的所有小写字母,即a|b|...|x|y|z,匹配任意一个小写字母 。[^a - z]表示匹配除了小写字母a到z之外的任意字符。

重复次数限定:a{2,6}表示匹配字符a至少 2 次,至多 6 次 。例如,ba{2,6}c可以匹配baaacbaaaac等,但不能匹配bac

综合示例:today[0 - 9]+errors,这个正则表达式表示以today开头,中间有 1 个以上的数字,最后以error结尾 。像today123error能匹配,而todayerrortoday123caerror则不能匹配。

三、正则表达式的测试与应用

(一)在线测试工具

可以使用https://regexr.com/这个在线工具来测试正则表达式。在该网站上,输入正则表达式和测试文本后,结果会实时更新,能直观看到哪些文本匹配,哪些不匹配。还能通过滚动查看匹配的详细信息,利用工具探索结果,并且支持撤销和重做操作 。

(二)与文本处理工具的关系

在 Linux 系统中,有文本处理 “三剑客”:grep(内容过滤器)、awk(文本分析器)、sed(行文本处理器)。

正则表达式在这些工具中起着关键作用,就像是给它们配备了强大的 “武器”(Buffer),让它们在文本处理时更高效、更灵活。

例如,grep结合正则表达式,可以快速从文件中筛选出符合特定模式的行;awk使用正则表达式进行数据提取和分析;sed借助正则表达式实现文本替换、删除等操作 。