我有一个perl脚本,用于解析来自Cisco ASA5500网络设备的路由表。我想捕捉每一行的最后一个单词,以便进一步分析。一个典型的路由表条目看起来像。。。
C 123.201.2.12 255.255.252直接连接,在外部
要获得每行中的最后一个单词,我使用:
$line =~ /(bw*s*$)/;
print $1."n";
而且它大部分时间都很好用。但是,一些工程师在名称中加了连字符,比如dmoc-net。这个词的输出就是net。我明白为什么会发生这种情况,因为元字符\w*没有-,它包括[a-zA-Z0-9_]。有没有一种方法可以得到一行中的最后一个单词,包括那些带连字符的单词?
这个怎么样?
$line =~ /(b(w|[-])*s*$)/;
print $1."n";
说明:您希望正则表达式匹配由w
和字符-
表示的字符类中的元素组成的子字符串。您不能在语法上用速记符号将其表示为单个字符类。然而,您总是可以将字符类表示为所述字符类的分区的组成部分之间的交替(尽管这样做通常没有意义;例如,[a-zA-Z0-9_]
等效于([a-z]|[A-K]|[L-Z0-3]|[4-9]|_)
)。
因此,在您的案例中,您将概念字符类[{{w}}-]
(发明的即席语法)拆分为(w|[-])
。