我需要匹配下面显示的窗口中显示的字符串:
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
两边的括号不是必需的。
关于c# - 简单的正则表达式问题 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6294499/