数据安全实践:能力体系、产品实现与解决方案
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4.1 正则表达式

正则表达式是一种文本模式,可以用来检查一个字符串是否含有某个子字符串、将匹配的子字符串进行替换或者从一个字符串中取出符合某个条件的子字符串等。正则表达式由普通字符和元字符组成,普通字符表示自身,元字符表示一些特殊的含义或功能。正则表达式可以用来进行各种文本处理,如验证输入格式、搜索和替换、数据提取等。

正则表达式的语法和用法因不同的编程语言或工具而有所差异,但基本的规则和元字符都是相同的。常见的编程语言中使用正则表达式的记法都源于Perl,现在普遍使用的正则表达式绝大部分属于PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式)这个分支。因此,通常的做法是实施PCRE的语法规则。PCRE的语法规则包括但不限于以下几个方面:

● 单字符表达式:用来匹配单个字符,如.匹配除换行符之外的任何字符,[xyz]匹配x、y或z中的任意一个,\d匹配任何十进制数字。

● 复合匹配:用来连接或选择两个或多个表达式,如xy匹配x后接y,x|y匹配x或y。

● 重复匹配:用来指定一个表达式可以出现的次数,如x*匹配零次或多次x,x+匹配一次或多次x,x?匹配零次或一次x,x{n,m}匹配n到m次x。

● 分组构造:用来将一个表达式作为一个整体进行操作,如(re)表示一个编号捕获组,可以获取匹配的子字符串,(?:re)表示一个非捕获组,不会获取匹配的子字符串。

● 定位点:用来指定匹配必须出现在字符串中的某个位置,如^匹配字符串的开头,$匹配字符串的结尾,\b匹配单词边界。

● 空字符串:用来匹配空字符串或者不消耗任何字符的条件,如(?=re)表示一个前向肯定界定符,只有当后面跟着re的时候才能匹配成功。

正则表达式对计算性能有较高的要求。如果添加正则表达式条件,请对系统进行一小段时间的观察,确保系统速度不会降低,且不存在误报。

如果正在实施正则表达式匹配,请在将策略规则部署到生产之前考虑使用第三方工具测试正则表达式。推荐使用RegexBuddy,RegExr(regexr.com)也不错。