1

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

[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

我必须匹配输入并基于匹配,创建一个带有 value 的变量hostname-eventname

我的正则表达式

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

我想在引用变量中分别显示主机和事件的名称,例如$2or $3

例如,考虑这个输入:

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

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

说,

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

我不能再应用任何拆分操作。所以没有编程:我只能读取输入数据。是的,正则表达式是 Perl 正则表达式类型。

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

4

2 回答 2

4

您可以使用

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

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

于 2010-12-02T15:47:27.357 回答
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
于 2010-12-02T15:50:58.170 回答