虽然我们不建议使用正则表达式,但正则表达式是iRules 发开发过程中的“不可避免的弊端”。本文将讨论支持正则表达式的一些命令和一些工具,你可以用来来处理一些你所需要的格式。
正则表达式
一个正则表达式,就是用某种特定的语法规则去描述或者匹配一组字符串的一个公式。
正则表达式(REs)有两种基本的表达形式:扩展的正则表达式(“ERE”)和基本正则表达式。从Unix的角度来看,ERE从大体上来说适合传统的egrep使用的表达式是相同的,而BRE大体上和传统的ed使用相同的表达式。TCL在实现正则表达式的时候加入了第三种方式,高级正则表达式(ARE),ARE是在ERE的基础上加入了一些显著的扩展。
 
讨论上述问题已经超出了本文讨论的正则表达式的范围。更多的说明请在TCL文档内置命令部分的re_syntax documentr 目录下。
正则表达式举例
正则表达式是什么样的呢?例如一个简单的由字符组成的字符串用于精确匹配“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" } {

总结
 
正则表达式可用于一些棘手的情况下,需要进行一些“疯狂”的搜索的时候,例如这样的一个搜索:“查找位于“abc”或“def”后包含123的字符串,或者是查找字符串中的一个5位的标准的美国邮政编码“ 。此外,如果需要寻找一个字符串在另一个字符串中的确切位置,(例如,用一串字符替代另一串字符的时候) ,此时,使用regexp和regsub可能会解决上述工作(在Stream Profile不工作的前提下)。因此,在某些情况下,正则表达式似乎是唯一的选择。但只要记住:即使使用多个字符串的比较测试也比一个正则表达的效率高,因此,你需要很明智的使用它们。