我以下列方式从服务器接收输入(示例输入数据):
[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正则表达式。
我不知道我是否澄清了我的疑问?
答案 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