iRules 101 - #10 - 正则表达式
虽然我们不建议使用正则表达式,但正则表达式是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" } {
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不工作的前提下)。因此,在某些情况下,正则表达式似乎是唯一的选择。但只要记住:即使使用多个字符串的比较测试也比一个正则表达的效率高,因此,你需要很明智的使用它们。
Published Feb 02, 2009
Version 1.0ltwagnon
Ret. Employee
Joined May 15, 2019
ltwagnon
Ret. Employee
Joined May 15, 2019
No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)