简单的正则表达式问题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集成到我现有的代码中吗。提前谢谢。
当然可以将所有这些正则表达式合并为一个,但我建议不要这样做。考虑一下这种方法,首先它检查输入文本的整体形式是否正确,然后检查"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;