如何从Regex嵌套反向引用中获取内部值

时间:2010-12-02 15:42:35

标签: regex perl backreference capturing-group

我以下列方式从服务器接收输入(示例输入数据):

[1284336000]: host1;event1;flag;state;counter;errors or warnings
[1284336000]: host2;event1;flag;state;counter;errors or warnings
[1284336000]: host1;event2;flag;state;counter;errors or warnings
[1284336000]: host2;event2;flag;state;counter;errors or warnings

我必须匹配输入并根据匹配创建一个值为hostname-eventname的变量。

我的正则表达式

^\[\d+\]:\s((host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

我希望在$2$3等参考变量中分别使用主机和事件的名称。

例如,请考虑以下输入:

[1284336000]: host1;event1;flag;state;counter;errors or warnings

我需要根据从上面的匹配中获取的主机名和事件名创建名为<hostname-eventname>的变量。

说,

$myVar=$2-$3  (that is, $myVar=host1-event1)

我无法再进行任何拆分操作。所以没有编程:我只能读取输入数据。是的,正则表达式是Perl正则表达式。

我不知道我是否澄清了我的疑问?

2 个答案:

答案 0 :(得分:4)

您可以使用

"^\[\d+\]:\s([^;]*);([^;]*)"

并在前两个捕获组中包含主机和事件名称。

答案 1 :(得分:3)

您需要使用分支重置运算符(?|…|…|…)

^\[\d+\]:\s(?|(host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

或更清晰:

m{
    ^ \[ \d+ \] : \s
    (?| (host1);(event1)  # $1, $2
      | (host2);(event2)  # $1, $2
      | (host3);(event2)  # $1, $2
      | (host2);(event1)  # $1, $2
    )
    ;
    (\w+);(\w+)           # $3, $4
    ; (\d)                # $5
    .+ $
}x