简单的正则表达式问题C#

时间:2011-06-09 14:32:06

标签: c# .net regex

我需要匹配下面显示的窗口中显示的字符串:

  

来自software-files-l.cnet.com的setup_av_free.exe的8%已完成

     

来自65.55.72.119的test.zip的98%已完成

     

来自[hostname |的[filename]的[数字]% IP地址]已完成

我已经中途写了正则表达式

if (Regex.IsMatch(text, @"[\d]+%[\s]of[\s](.+?)(\.[^.]*)[\s]from[\s]"))
    MessageBox.Show(text);

我现在需要将以下正则表达式集成到我上面的代码中

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";  

ValidHostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"; 

2个正则表达式取自link。当我使用Regex.ismatch匹配“123.123.123.123”和“software-files-l.cnet.com”时,这两个正则表达式运行良好。但是,当我将它们与我的现有正则表达式代码集成时,我无法使它工作。我尝试了几种变体,但却无法使其发挥作用。有人可以指导我将2个正则表达式集成到我现有的代码中。提前谢谢。

4 个答案:

答案 0 :(得分:2)

你当然可以将所有这些正则表达式合并为一个,但我建议不要这样做。考虑这种方法,首先检查输入文本是否具有正确的整体形式,然后检查“from”部分是IP地址还是主机名。

bool CheckString(string text) {
    const string ValidIpAddressRegex = @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";  

    const string ValidHostnameRegex = @"^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"; 

    var match = Regex.Match(text, @"[\d]+%[\s]of[\s](.+?)(\.[^.]*)[\s]from[\s](\S+)");
    if(!match.Success)
        return false;        

    string address = match.Groups[3].Value;

    return Regex.IsMatch(address, ValidIpAddressRegex) ||
           Regex.IsMatch(address, ValidHostnameRegex); 
}

它可以做你想要的,并且比单个怪物大小的正则表达式更具可读性。如果你不打算在循环中将这种方法称为数百万次,那么没有理由担心单个正则表达式的性能会降低。

此外,如果您不知道\d\s周围的括号不是必需的。

答案 1 :(得分:2)

这两个正则表达式与您的字符串不匹配的“问题”是它们以^开头,以$结尾

^表示匹配字符串的开头(如果m修饰符被激活,则为行) $表示匹配字符串的结尾(如果激活了m修饰符,则为行)

当你尝试它时,这是真的,但在你的真实文本中,它们位于字符串的中间,所以它不匹配。

尝试删除最开头的^和最后的$

答案 2 :(得分:0)

你走了。

^[\d]+%[\s+]of[\s+](.+?)(\.[^.]*)[\s+]from[\s+]((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])|((([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])))[\s+]Completed

从上面的ValidIpAddressRegex和ValidHostnameRegex示例中删除^和$字符,并用括号括起来的或字符(|)分隔它们。

答案 3 :(得分:0)

你可以使用它,它应该适用于所有情况。我可能在格式化时不小心删除了一个字符,所以让我知道它是否无效。

string captureString = "8% of setup_av_free.exe from software-files-l.cnet.com Completed";
Regex reg = new Regex(@"(?<perc>\d+)% of (?<file>\w+\.\w+) from (?<host>" +
    @"(\d+\.\d+.\d+.\d+)|(((https?|ftp|gopher|telnet|file|notes|ms-help):" +
    @"((//)|(\\\\))+)?[\w\d:#@%/;$()~_?\+-=\\\.&]*)) Completed");
Match m = reg.Match(captureString);
string perc = m.Groups["perc"].Value;
string file = m.Groups["file"].Value;
string host = m.Groups["host"].Value;