我需要匹配下面显示的窗口中显示的字符串:
来自software-files-l.cnet.com的setup_av_free.exe的8%已完成
来自65.55.72.119的test.zip的98%已完成
来自[hostname |的[filename]的[数字]% IP地址]已完成
我已经中途写了正则表达式
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个正则表达式集成到我现有的代码中。提前谢谢。
答案 0 :(得分:2)
你当然可以将所有这些正则表达式合并为一个,但我建议不要这样做。考虑这种方法,首先检查输入文本是否具有正确的整体形式,然后检查“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
周围的括号不是必需的。
答案 1 :(得分:2)
这两个正则表达式与您的字符串不匹配的“问题”是它们以^
开头,以$
结尾
^
表示匹配字符串的开头(如果m修饰符被激活,则为行)
$
表示匹配字符串的结尾(如果激活了m修饰符,则为行)
当你尝试它时,这是真的,但在你的真实文本中,它们位于字符串的中间,所以它不匹配。
尝试删除最开头的^
和最后的$
。
答案 2 :(得分:0)
你走了。
^[\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示例中删除^和$字符,并用括号括起来的或字符(|)分隔它们。
答案 3 :(得分:0)
你可以使用它,它应该适用于所有情况。我可能在格式化时不小心删除了一个字符,所以让我知道它是否无效。
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;