iRules 101 - #10 - 正则表达式
虽然我们不建议使用正则表达式,但正则表达式是iRules 发开发过程中的“不可避免的弊端”。本文将讨论支持正则表达式的一些命令和一些工具,你可以用来来处理一些你所需要的格式。
正则表达式
一个正则表达式,就是用某种特定的语法规则去描述或者匹配一组字符串的一个公式。
正则表达式(REs)有两种基本的表达形式:扩展的正则表达式(“ERE”)和基本正则表达式。从Unix的角度来看,ERE从大体上来说适合传统的egrep使用的表达式是相同的,而BRE大体上和传统的ed使用相同的表达式。TCL在实现正则表达式的时候加入了第三种方式,高级正则表达式(ARE),ARE是在ERE的基础上加入了一些显著的扩展。
讨论上述问题已经超出了本文讨论的正则表达式的范围。更多的说明请在TCL文档内置命令部分的
re_syntax document
r 目录下。
正则表达式举例
正则表达式是什么样的呢?例如一个简单的由字符组成的字符串用于精确匹配“abc”的例子:
RE: {abc}
或者是构造一个字符串,用来查询在一个字符串中所有非空白的序列:
RE: {\S+}
也可以在一个范围内搜索字符,如搜索所有三个小写字母的组合:
RE: {[a-z][a-z][a-z]}
甚至可以描述一个信用卡的号码:
{(?:3[4|7]\d{13})|(?:4\d{15})|(?:5[1-5]\d{14})|(?:6011\d{12})}
欲了解更多的语法信息,请参阅手册TCL documentation 下的
re_syntax manual page
文件。
支持正则表达式的命令
在TCL语言规则中,下面的内置命令可以支持正则表达式:
regexp
-匹配一个字符串的正则表达式
regsub
-基于正则表达式进行模式匹配之后执行替换
lsearch
-查看表单中是否包含特定元素
switch
-根据表达式匹配值来执行一个或多个脚本
iRules也有与之类似的命令: “if” , “ matchclass ”和“ findclass ”
matches_regex
-检验一个字符串与正则表达式匹配
三思而后行,是否使用正则表达式
正则表达式是很消耗CPU的,大多数情况下,我们有更快,更有效的的替代解决方案。不过在极少数的情况下,正则表达式是不可替代的,例如信用卡号过滤的iRules中 ,对字符串的搜索的实现是很困难的,但使用正则表达式那就方便得多了。但是,大多数其他的情况下,我们强烈建议你查找替代的解决方案。“swith -glob”和“string match”命令使用”glob类型”匹配来实现一个正则表达式的子集,但他们允许使用通配符和字符串组,这些在大部分情况下正是你需要的功能。
不过,不管什么情况下,如果你正在考虑使用正则表达式做字符串的比较的时候,那么请考虑、考虑、再考虑使用“equals” , “contains” , “ starts_with ”和“ ends_with ”等命令或者是上面提到的glob匹配模式来替代它。不仅是因为这些命令的执行会快速很多,而且他们事实上就是完成同样的功能。
下面有一个例子
BAD: if { [regexp {bcd} "abcde"] } {
BAD: if { "abcde" matches_regex "bcd" } {
BETTER: if { [string match "*bcd*" "abcde"] } {
BEST: if { "abcde" contains "bcd" } {
BAD: if { "abcde" matches_regex "bcd" } {
BETTER: if { [string match "*bcd*" "abcde"] } {
BEST: if { "abcde" contains "bcd" } {