C# 使用.NET正则表达式解析当前安装的软件包的WSUS更新

C# 使用.NET正则表达式解析当前安装的软件包的WSUS更新,c#,.net,regex,vb.net,C#,.net,Regex,Vb.net,问题:当前正则表达式模式未过滤所有行。在模式的开头加上“^”,在结尾加上“$”似乎也会打破它。如果我尝试使用它,它会使用选项(多行&不区分大小写)给出部分结果。在应用程序中使用它不会返回任何结果 问题: 为什么这个正则表达式不能与 所有行和部分给出结果 我以为这是.NET正则表达式 引擎。为什么它在那里和那里工作 不在这里 我是否缺少正确的语法,或者 模式只是缺少一些东西 关键的Regex总是让我发疯 //格式:(KB980218) // //示例:基于x64系统的Windows 7安全更新(K

问题:
当前正则表达式模式未过滤所有行。在模式的开头加上“^”,在结尾加上“$”似乎也会打破它。如果我尝试使用它,它会使用选项(多行&不区分大小写)给出部分结果。在应用程序中使用它不会返回任何结果

问题:

  • 为什么这个正则表达式不能与 所有行和部分给出结果
  • 我以为这是.NET正则表达式 引擎。为什么它在那里和那里工作 不在这里
  • 我是否缺少正确的语法,或者 模式只是缺少一些东西 关键的Regex总是让我发疯
  • //格式:(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的累积安全更新(KB248217)
    基于x64系统的Windows 7安全更新(KB2425227)
    Windows恶意软件删除工具x64-2011年2月(KB890830)
    基于x64系统的Windows 7安全更新(KB2479628)
    针对基于x64系统的Windows 7更新(KB2467023)
    Windows Live软件包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)
    KB:
    =======================================================================================================
    标题:Windows恶意软件删除工具x64-2011年3月(KB890830)
    KB:
    =======================================================================================================
    标题:Microsoft Silverlight(KB2495644)的更新
    KB:
    =======================================================================================================

    //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;
    
    }
    
    使用上述方法,我一无所获。在.net的online regex tester上使用以下模式,我只能得到部分结果。

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


    首先,请注意,有些KB数字有六位数,有些有七位数

    \(KB\d{6,7}\)
    
    我想这就解释了为什么您的代码与某些行匹配,而与其他行不匹配。这也适用于使用不区分大小写和多行的regexlib测试仪。请注意,您需要对模式中的括号进行转义,否则它们具有特殊意义(用于分隔捕获组)

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

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

    这没有多大意义。

    结果是所需的模式是(KB\d+)。无论如何,谢谢。

    你希望
    GrabKBUpdate
    中的正则表达式匹配做什么?在我看来,它会匹配重复的单词,但我不明白你为什么要这样做。你在最后提到的另一个模式似乎丢失了(至少)
    d
    前面的反斜杠,括号不匹配。当您说“只能得到部分结果”时,你是什么意思?例如,你的意思是你把你之前列出的所有行都给了它,而你找到的唯一匹配项是最后列出的四行,还是什么?我的错!我在第一种情况下有错误的图案第二种情况下,我只是没有从项目中没有的记事本上复制粘贴的内容。它现在已修复。在这一页上。回答你的问题关于GrabKBUpdate()的操作。它应该从字符串返回kbarticle。应该是这样的(KB890830)。上面是示例块。尽管它不再重要:
    \1
    是一个反向引用。它表示“此RE中第一个括号组匹配的内容”。(严格地说,使用反向引用意味着您拥有的不再是原始技术意义上的正则表达式,但“正则表达式”长期以来意味着比原始技术意义上更一般的东西。)我不认为
    foreach
    循环有什么可怕的地方。他/她只想返回最后一个匹配项(如果有),否则返回
    null
    。这不是最有效的方法,但我打赌在这个应用程序中,这在实践中并不重要。@Gareth很抱歉在我上次编辑时让你的评论变得无关紧要。我发布后意识到了这一点我说的很多话都不是很重要。谢谢你提醒我回溯参考。我用它已经有一段时间了。没问题。(对于我们未来的读者群:Nightforce2的问题最初包含错误的regexp;Kimberley的回答最初是关于错误的regexp的问题;我的评论是针对Kimberley的回答。Nightforce修复了错误的regexp,Kimberley删除了关于它的问题:-))在发布之前没有完全检查它。我忘了我在记事本中的功能与IDE中的完全不同,而是复制了记事本版本。她确实有很好的理解力,这也是我最初的想法。就像y一样
    foreach (Match match in matches)
        result = match.Value;
    return result;