简单正则表达式问题C#

简单正则表达式问题C#,c#,.net,regex,C#,.net,Regex,我需要匹配下面显示的窗口中显示的字符串: 从software-files-l.cnet.com完成8%的安装\u av\u free.exe test.zip从65.55.72.119的98%已完成 [hostname | IP地址]中[filename]的[numeric]%已完成 我已经写了一半正则表达式模式 if (Regex.IsMatch(text, @"[\d]+%[\s]of[\s](.+?)(\.[^.]*)[\s]from[\s]")) Messag

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

从software-files-l.cnet.com完成8%的安装\u av\u free.exe

test.zip从65.55.72.119的98%已完成

[hostname | IP地址]中[filename]的[numeric]%已完成

我已经写了一半正则表达式模式

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])$"; 
这两个正则表达式是从这个函数中提取的。当我使用regex.ismatch来匹配“123.123.123.123”和“software-files-l.cnet.com”时,这两个正则表达式工作得很好。然而,当我将它们集成到我的existin regex代码中时,我无法让它工作。我试过几种变体,但都没能成功。有人能指导我将2个正则表达式集成到现有代码中吗。提前谢谢。

给你

^[\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示例中删除“^”和“$”字符,并添加它们,用括号括起的或字符(|)分隔。

开始

^[\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示例中删除“^”和“$”字符,并添加它们,用括号括起来的or字符(|)分隔。

您当然可以将所有这些正则表达式合并为一个,但我建议不要这样做。考虑这个方法,首先检查你的输入文本是否有正确的形式,然后检查“从”部分是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
周围的括号是不必要的。

您当然可以将所有这些正则表达式合并为一个,但我建议不要这样做。考虑这个方法,首先检查你的输入文本是否有正确的形式,然后检查“从”部分是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
周围的括号是不必要的。

您可以使用它,它应该适用于所有情况。我可能在格式化时意外删除了一个字符,所以如果它不起作用,请告诉我

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;
string captureString=“从software-files-l.cnet.com完成8%的安装\u av\u free.exe”;
正则表达式reg=新正则表达式(@“(?\d+)%的(?\w+\.\w+)来自(?)+
@“(\d+\.\d+.\d+.\d+)”((https?| ftp | gopher | telnet | file | notes | ms help):”+
@“(/)|(\\\)+)?[\w\d:\\@%/;$()~\\+-=\\\\.&]*)已完成”);
匹配m=注册匹配(captureString);
字符串perc=m.Groups[“perc”].值;
字符串file=m.Groups[“file”].Value;
字符串host=m.Groups[“host”].Value;

您可以使用它,它应该适用于所有情况。我可能在格式化时意外删除了一个字符,所以如果它不起作用,请告诉我

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;
string captureString=“从software-files-l.cnet.com完成8%的安装\u av\u free.exe”;
正则表达式reg=新正则表达式(@“(?\d+)%的(?\w+\.\w+)来自(?)+
@“(\d+\.\d+.\d+.\d+)”((https?| ftp | gopher | telnet | file | notes | ms help):”+
@“(/)|(\\\)+)?[\w\d:\\@%/;$()~\\+-=\\\\.&]*)已完成”);
匹配m=注册匹配(captureString);
字符串perc=m.Groups[“perc”].值;
字符串file=m.Groups[“file”].Value;
字符串host=m.Groups[“host”].Value;
这两个正则表达式与字符串不匹配的“问题”是它们以
^
开头,以
$
结尾

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

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

^
和结尾的
$

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

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

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


尝试只删除开头的
^
和结尾的
$

集成它们的尝试是什么样子的?是否存在主机名或ip无效的情况?或者您只是想知道它是主机名还是ip?集成它们的尝试是什么样子的?是否存在主机名或ip无效的情况?或者你只是想知道它是主机名还是ip?我以前已经做过类似的事情了,而且很有效。但为了提高效率,我需要将所有这些正则表达式合并到一个正则表达式中,而不是占用内存,而是声明额外的字符串。输入文本将始终有效,因为它来自计算机上当前IE active downloads的标题栏。@abduls85:为什么要检查它?文本将包含桌面上所有打开的窗口。我只需要过滤当前的下载作业。感谢您的输入。@abduls85:无论如何,我发现很难相信这项任务的性能要求如此严格,以至于您只需要使用一个正则表达式(但还没有严格到完全排除正则表达式的使用)。这是我目前开发的整个多线程应用程序的一个次要功能。所以需要有点严格。我以前已经做过类似的事情了,而且很有效。但是我需要一个