Skip to main content
 首页 » 编程设计

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

2024年02月23日28wayfarer

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

8% of setup_av_free.exe from software-files-l.cnet.com Completed

98% of test.zip from 65.55.72.119 Completed

[numeric]%of[filename]from[hostname | IP address]Completed

正则表达式模式写到一半

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 正则表达式集成到我现有的代码中吗?提前致谢。

请您参考如下方法:

您当然可以将所有这些正则表达式组合成一个,但我不建议这样做。考虑这种方法,首先它会检查您的输入文本总体上是否具有正确的形式,然后它会检查“发件人”部分是 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 两边的括号不是必需的。