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