regex分组因多个组而失败

本文关键字:失败 regex | 更新日期: 2023-09-27 17:57:39

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

我错过的是,他们都是自己工作的,但不是完整的团队地图。

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; 的字符串

regex分组因多个组而失败

问题出在第一组中的(.*?)*上。请改用(.*?)

当匹配而不匹配第二组时,只匹配到行的末尾。然而,当增加第二组时,它需要后退以允许第二组匹配。由于你有两个量词在交互,所以有很多方法可以匹配,直到它后退到足以让第二组匹配为止。

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

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

这还不包括regex可能匹配的空字符串(因为.*也会匹配空字符串)。尝试多匹配一个字符,比如abcd,会产生尽可能多的匹配:

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

因此,每添加一个字符,可能匹配的数量就会翻倍。