3

我仍在学习正则表达式,还有很长的路要走,所以希望各位有更多正则表达式经验的人提供帮助。我正在研究一个 perl 脚本来解析多个日志文件,并解析某些值。在这种情况下,我试图获取用户名列表。

这是我的日志文件的样子:

  [date timestamp]UserName = Joe_Smith
  [date timestamp]IP Address = 10.10.10.10

..

只是测试,我已经能够使用 将其拉出\UserName\s\=\s\w+,但是我只想要实际的 UserName 值,而不包括 'UserName =' 部分。理想情况下,如果我可以让它工作,我应该能够应用相同的逻辑来提取 IP 地址等,但只是希望暂时获得用户名列表。

此外,用户名始终采用 上面的格式Firstname_Lastname,所以我相信 \w+ 应该总是得到我需要的一切。

感谢任何帮助!

4

3 回答 3

5

您应该在正则表达式中使用括号捕获您感兴趣的匹配字符串部分。

如果匹配成功,则内置变量等中的捕获可用$1$2按正则表达式中左括号出现的顺序编号。

在这种情况下,您只需要一次捕获,因此您只需要查看$1.

请注意,在使用捕获变量中的值之前,您应该始终检查正则表达式匹配是否成功,因为它们会保留上次成功匹配的值,而失败的匹配不会重置它们。

use strict;
use warnings;

my $str = '[date timestamp]UserName = Joe_Smith';

if ($str =~ /UserName = (\w+)/) {
  print $1, "\n";
}

输出

Joe_Smith
于 2012-12-17T03:04:31.887 回答
2

另一种方法:

my ($username) = $str =~ /UserName\s\=\s(\w+)/
    or warn "no username parsed from '$str'\n";
于 2012-12-17T03:21:12.837 回答
1

您应该将正则表达式设为\UserName\s\=\s(\w+)$And 之后,括号中的部分将在变量中可用$1。我的 perl 有点生锈,所以如果它不能正常工作,请查看http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#StringSelections

于 2012-12-17T02:35:11.717 回答