【问题标题】:Using .NET Regex to parse WSUS updates for currently installed packages使用 .NET Regex 解析当前安装包的 WSUS 更新
【发布时间】:2011-03-20 00:40:59
【问题描述】:

问题:
当前的正则表达式模式不会过滤所有行。在模式的开头添加 ^ 并在模式的结尾添加 $ 似乎也会破坏它。如果我在http://www.regexlib.com 上尝试它,它会使用选项(多行和不区分大小写)给出部分结果。在应用程序中使用它根本不会返回任何内容。

问题:

  1. 为什么这个正则表达式不起作用 所有行并部分给出结果。
  2. 我以为这是 .NET 正则表达式 引擎。为什么它在那里工作 不在这里???
  3. 是我缺少正确的语法还是 模式只是缺少一些东西 至关重要的??正则表达式总是让我发疯......

// 格式:(KB980218)
//
// 示例:
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2479943)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2479943)
Windows 恶意软件删除工具 x64 - 2011 年 3 月 (KB890830)
Microsoft Silverlight 更新 (KB2495644)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2483614)
适用于基于 x64 的系统的 Windows 7 的 Internet Explorer 8 累积安全更新 (KB2482017)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2425227)
Windows 恶意软件删除工具 x64 - 2011 年 2 月 (KB890830)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2479628)
适用于基于 x64 的系统的 Windows 7 更新 (KB2467023)
Windows Live Essentials 2011 (KB2434419)
适用于基于 x64 的系统的 Windows 7 更新 (KB2454826)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2475792)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2393802)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2485376)
适用于基于 x64 的系统的 Windows 7 更新 (KB976902)
Windows 恶意软件删除工具 x64 - 2011 年 1 月 (KB890830)
适用于基于 x64 的系统的 Windows 7 安全更新 (KB2419640)
适用于基于 x64 的系统的 Windows 7 的 Internet Explorer 8 兼容性视图列表更新 (KB2447568)
适用于基于 Windows 7 x64 的系统的 Media Center 累积更新 (KB2284742)
Microsoft Silverlight 更新 (KB2477244)

测试此函数返回标题但没有 kb 文章编号。 ==================================================== =================================
标题:适用于基于 x64 的系统的 Windows 7 安全更新 (KB2479943)
知识库#:
==================================================== =================================
标题:Windows 恶意软件删除工具 x64 - 2011 年 3 月 (KB890830)
知识库#:
==================================================== =================================
标题:Microsoft Silverlight 更新 (KB2495644)
知识库#:
==================================================== ==================================

//Main Method output example
Console.WriteLine("=====================================================================================");
foreach (string s in KbUpdates)
{
    string format = string.Format("Title:{0}\r\nKB#:{1}", s, GrabKBUpdate(s.ToString()));

    Console.WriteLine(format);
    Console.WriteLine("=====================================================================================");
}

public static string GrabKBUpdate(string updatestring)
{
    string result = null;
    string pattern = @"(((\w{2}\d{6}) ?)";
    string input = updatestring;
    Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
    MatchCollection matches = rgx.Matches(input);

    if (matches.Count > 0)
    {
        foreach (Match match in matches)
           result = match.Value;
        return result;
    }
    return result;

}

使用上面的这个方法我什么也得不到。在http://www.regexlib.com .net 在线正则表达式测试器上使用以下模式,我只能得到部分结果。

匹配模式:(((\w{2}\d{6}) ?)

Match   $1  $2
(KB890830)  (KB890830)  (KB890830)
(KB890830)  (KB890830)  (KB890830)
(KB976902)  (KB976902)  (KB976902)
(KB890830)  (KB890830)  (KB890830)

【问题讨论】:

  • 您希望GrabKBUpdate 中的正则表达式匹配做什么?在我看来,它会匹配重复的单词,但我不明白你为什么要这样做。
  • 您最后提到的另一种模式似乎缺少(至少)d 之前的反斜杠,并且括号不匹配。当你说你“只得到部分结果”时,你是什么意思?例如,您的意思是您将之前列出的所有行都输入了它,而您找到的唯一匹配项是您最后列出的四行,还是什么?
  • 我的错!在第一种情况下,我的模式错误,第二次我只是没有从不在项目中的记事本复制粘贴。它现在固定了。在这个页面上。
  • 回答您关于 GrabKBUpdate() 的问题。它应该从字符串中返回 kbarticle。应该看起来像这样 (KB890830)。示例块在上面。

标签: c# .net regex vb.net


【解决方案1】:

首先,请注意一些 KB 编号有六位数字,而一些有七位数字。单独匹配KB数的表达式可以很简单

\(KB\d{6,7}\)

我认为这解释了为什么您的代码匹配某些行而不匹配其他行。这也适用于具有 CaseInsensitive 和 Multiline 的 regexlib 测试器。请注意,您需要对模式中的括号进行转义,否则它们具有特殊含义(用于分隔捕获组)。

我希望这能回答您的问题。无论如何,看起来你需要检查你的方法的逻辑,因为你有

foreach (Match match in matches)
    result = match.Value;
return result;

这没有多大意义。

【讨论】:

  • 虽然这不再重要了:\1 是一个反向引用。它的意思是“与此 RE 中的第一个括号组匹配的任何内容”。 (严格来说,使用反向引用意味着您所拥有的不再是原始技术意义上的正则表达式,但“正则表达式”长期以来意味着比原始技术意义上更普遍的东西。)
  • 我认为foreach 循环没有什么可怕的。他/她只想返回最后一场比赛(如果有的话),否则返回null。这几乎不是最有效的方法,但我敢打赌,在这个应用程序的实践中这并不重要。
  • @Gareth 很抱歉让您的评论与我上次的编辑无关。我发帖后才发现,我说的很多东西都不是很重要。感谢您对反向引用的提醒。我已经有一段时间没有使用它了。
  • 没问题。 (对于我们未来的读者群:Nightforce2 的问题最初包含错误的正则表达式;Kimberley 的答案最初询问了一个关于该错误正则表达式的问题;我的评论是针对 Kimberley 的回答。Nightforce 修复了错误的正则表达式,Kimberley 删除了有关它的问题:- ).)
  • 在发布之前没有完全检查它。我忘记了我在记事本中的功能与 IDE 中的功能完全不同,而是复制了记事本版本。她确实有很好的理解,这就是我最初的想法。正如你所看到的,我的只是有点不同。 foreach 的目的是返回第一个不漂亮的匹配,但它会起作用,如果需要,您总是可以选择稍后更改它(只需测试正则表达式模式就可以完成)。
【解决方案2】:

最终需要的模式是 (KB\d+)。无论如何,谢谢。

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2022-01-04
    • 2022-08-03
    相关资源
    最近更新 更多