正则表达式分组失败,有多个组

时间:2014-04-09 13:48:40

标签: c# regex regex-group

我有这个正则表达式,对于C#。警报部分工作正常,但是当我添加msg组时, 它只是挂起,光标在命令行上闪烁。

我错过了什么,他们都是独立工作,但不是完整的群体地图。

string pattern = @"(?<action>alert\s+(?:tcp|udp|icmp)\s+(.*?)*[(])\s+" +
                                     @"(?<msg>msg[:](.*?)\[;\s*])";
                    Regex rgx = new Regex(pattern);
                    Match res = rgx.Match(rule);

我尝试匹配#alert tcp $EXTERNAL_NET any -> $HOME_NET 12345:12346 (msg:"MALWARE-BACKDOOR netbus getinfo"; flow:to_server,established;

之类的字符串

1 个答案:

答案 0 :(得分:0)

问题在于您的第一组(.*?)*。请改为(.*?)

当匹配而没有第二组时,只匹配直到行的结尾。但是,添加第二组时,需要退回以允许第二组匹配。由于你有两个量词交互,所以有很多方法可以匹配,直到它足够后退以允许第二组匹配。

一个例子。假设您将字符串abc(.*?)*匹配。匹配的方法是:

(a)(b)(c)
(a)(bc)
(ab)(c)
(abc)

并且这不计算正则表达式可能匹配的空字符串(因为.*也匹配空字符串)。 尝试匹配一个字符,比如说abcd,产生尽可能匹配:

(a)(b)(c)(d)
(a)(b)(cd)
(a)(bc)(d)
(a)(bcd)
(ab)(c)(d)
(ab)(cd)
(abc)(d)
(abcd)

因此,对于每个添加的角色,可能的匹配数量会翻倍。