正则表达式:如何匹配[]之间可能存在或不存在的内容

时间:2013-12-13 06:04:52

标签: regex perl pcre

我正在使用Perl解析日志,我对如何解析这样的事情感到难过:

from=[ihatethisregex@hotmail.com]
from=ihatethisregex@hotmail.com

我需要的是ihatethisregex@hotmail.com,我需要在一个名为“email”的命名捕获组中捕获它。

我尝试了以下内容:

(?<email>(?:\[[^\]]+\])|(?:\S+))

但是当它解析第一行时会捕获方括号。我不想要方括号。想知道我是否可以这样做:

(?:\[(?<email>[^\]]+)\])|(?<email>\S+)

当我评估$+{email}时,它只会选择匹配的那个。我也尝试了以下内容:

(?:\[?(?<email>(?:[^\]]+\])|(?:\S+)))

但是当电子邮件被包裹在一对方括号中时,这会产生奇怪的结果。

感谢任何帮助。

3 个答案:

答案 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