Vb.net 从文本中提取目录字符串

Vb.net 从文本中提取目录字符串,vb.net,string,logging,Vb.net,String,Logging,我有一个用visual basic 2010制作的程序,该程序将提取损坏文件的日志,并向用户提供损坏文件的位置以进行修复。这些日志非常庞大,根据损坏的程度而有所不同 我已经在代码中设置了只提取标记为错误的文本行,但是在这些行中,有指向文件损坏的目录。我需要知道是否有办法读取这些目录并将它们放入RichTextBox。以下是日志文件中的一行示例: oa=@0x238282b270->OBJECT\u ATTRIBUTES{s:48;rd:NULL;on:[100]“\??\C:\Windows\W

我有一个用visual basic 2010制作的程序,该程序将提取损坏文件的日志,并向用户提供损坏文件的位置以进行修复。这些日志非常庞大,根据损坏的程度而有所不同

我已经在代码中设置了只提取标记为错误的文本行,但是在这些行中,有指向文件损坏的目录。我需要知道是否有办法读取这些目录并将它们放入
RichTextBox
。以下是日志文件中的一行示例:

oa=@0x238282b270->OBJECT\u ATTRIBUTES{s:48;rd:NULL;on:[100]“\??\C:\Windows\WinSxS\amd64\u 3ware.inf.resources\u 31bf3856ad364e35\u 10.0.10130.0\u en-us\u ca9e7cc7a071e60f”;a:(不区分大小写)},iosb=@0x238282b250,as=(NULL),fa=0

这是我需要从中提取的部分:

C:\Windows\WinSxS\amd64\U 3ware.inf.resources\U 31bf3856ad364e35\U 10.0.10130.0\U en-us\U ca9e7cc7a071e60f来自此字符串


我对这一切都很陌生,所以请耐心听我说。

RegEx为这类事情提供了极大的灵活性,但您需要建立一个已知的模式来定义路径的起点和终点。例如,如果它总是以[100]上的
作为前缀“\??\
,并且总是以
结尾”,然后可以使用此正则表达式模式提取它:

on:[100]“\\?\(.*?”

以下是模式的含义:

  • on:\[100\]“\\?\?\
    -匹配必须以[100]“\?\
上的
开头
  • 额外的反斜杠是转义所有特殊字符所必需的,否则这些字符将具有特殊意义。在这种情况下,
    [
    ]
    \
    对正则表达式都有特殊的意义,因此它们都需要在反斜杠之前加上一个空格来转义
  • (.*)
    -匹配项可以包含[100]“\??\
  • 上前面的
    和下面的
    ”之间任意数量的字符。这部分输入的值被捕获为未命名组(即组1)。
    
    • -开始捕获组
    • -匹配任何字符
    • *
      -任意次数
    • -以非贪婪的方式匹配(即,仅通过模式中跟随它的任何对象的第一个实例捕获)
    • -结束捕获组
  • ”;
    -匹配必须以这两个字符结尾
  • 例如:

    Dim input As String = "oa = @0x238282b270->OBJECT_ATTRIBUTES {s:48; rd:NULL; on:[100]""\??\C:\Windows\WinSxS\amd64_3ware.inf.resources_31bf3856ad364e35_10.0.10130.0_en-us_ca9e7cc7a071e60f""; a:(OBJ_CASE_INSENSITIVE)}, iosb = @0x238282b250, as = (null), fa = 0,"
    Dim m As Match = Regex.Match(input, "on:\[100\]""\\\?\?\\(.*?)"";")
    If m.Success Then
        Dim path As String = m.Groups(1).Value
    End If
    
    或者,如果输入可以包含多个匹配项,则可以按如下方式循环:

    For Each m As Match In Regex.Matches(input, "on:\[100\]""\\\?\?\\(.*?)"";")
        Dim path As String = m.Groups(1).Value
    Next
    

    这只是一个例子。根据您的需要,您可以根据需要调整RegEx模式。RegEx非常灵活,因此只要有某种逻辑方法来识别路径在字符串中的位置,就应该可以使用RegEx模式找到它。另一方面,由于模式本身只是一个字符串,所以它可以存储在n代码之外的配置设置,这是一个额外的好处。

    我们是否可以使用任何规则来确定文件名的开始和结束位置?例如,我们是否可以始终在开始处查找“\??”?它是否总是以双引号和分号结尾?文件是否始终位于“C:\”上?等等…是的,目录将始终位于C:驱动器上,字符串将以引号结束。这段代码看起来很有前途,我将继续使用它,但“匹配”不被识别。我需要导入什么才能使该命令正常工作。很抱歉我的无知,并感谢yalls的帮助。它是在
    System.Text.RegularExpressions.dll
    库中声明的,因此您需要在项目引用中引用它。它位于
    System.Text.RegularExpressions
    名称空间中,因此您需要完全限定它,或者将
    Imports System.Text.RegularExpressions
    指令添加到使用它的代码文件的顶部。此代码对于该日志非常有效,但对于其他日志则无效。你能给我描述一下如何正确格式化一个正则表达式模式,这样我就可以把它编辑成通用的吗?谢谢,我还建议您阅读系统驱动信。在某个人的机器上,我的代码不断崩溃,直到我看着机器。他将Windows驱动器号改为D:\。。。您可以将windir的env var作为字符串读取,然后将您的正则表达式更改为用户将其更改为的任何值。如果不看到各种条目,很难知道如何修复该模式。不过,我将对模式的各个部分的含义进行解释。