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

本文关键字:问题 正则表达式 简单 | 更新日期: 2023-09-27 17:58:42

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

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

test.zip从65.55.72.119的98%完成

[主机名| IP地址]中[文件名]的[数字]%已完成

我已经在的中途编写了正则表达式模式

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

现在我需要将以下regex集成到之上的代码中

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个正则表达式取自此链接。当我使用regex.ismatch来匹配";123.123.123.123";以及";software-files-l.cnet.com。然而,当我将两者集成到我现有的regex代码中时,我无法使其工作。我尝试了几种变体,但没能让它发挥作用。有人能指导我将2 regex集成到我现有的代码中吗。提前谢谢。

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

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

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

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

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

试着只删除最开始的^和最结束的$

开始吧。

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

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

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;