我正在使用Perl解析日志,我对如何解析这样的事情感到难过:
from=[ihatethisregex@hotmail.com]
from=ihatethisregex@hotmail.com
我需要的是ihatethisregex@hotmail.com
,我需要在一个名为“email”的命名捕获组中捕获它。
我尝试了以下内容:
(?<email>(?:\[[^\]]+\])|(?:\S+))
但是当它解析第一行时会捕获方括号。我不想要方括号。想知道我是否可以这样做:
(?:\[(?<email>[^\]]+)\])|(?<email>\S+)
当我评估$+{email}
时,它只会选择匹配的那个。我也尝试了以下内容:
(?:\[?(?<email>(?:[^\]]+\])|(?:\S+)))
但是当电子邮件被包裹在一对方括号中时,这会产生奇怪的结果。
感谢任何帮助。
答案 0 :(得分:3)
我倾向于分两步完成这些事情,只是因为它更清楚:
my ($val)= /\w+=(.*)/ ;
$val =~ s/\[(.*)\]/$1/e ;
单独修剪[]
。
答案 1 :(得分:3)
/(\[)?your-regexp-here(?(1)\]|)/
( ) capture group #1
\[ opening bracket
? optionally
your-regexp-here your regexp
(?( ) ) conditional match:
1 if capture group #1 evaluated,
\] closing bracket
| else nothing
请注意,这不适用于所有语言,因为条件匹配不是标准正则表达式的一部分,而是扩展名。但是在Perl中工作。
编辑:错误的问号。
答案 2 :(得分:1)
也许以下内容会有所帮助:
use strict;
use warnings;
while (<DATA>) {
/from\s*=\s*\[?(?<email>(?:[^\]]+))\]?/;
print $+{email}, "\n";
}
__DATA__
from=[ihatethisregex@hotmail.com]
from=ihatethisregex@hotmail.com
输出:
ihatethisregex@hotmail.com
ihatethisregex@hotmail.com