从文本中提取目录字符串

时间:2015-07-16 19:48:43

标签: vb.net string logging

我有一个程序,我正在使用visual basic 2010,它会提取已损坏文件的日志,并为用户提供已修复文件的位置。这些日志非常庞大,具体取决于损坏程度。

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

  

oa = @ 0x238282b270-> OBJECT_ATTRIBUTES {s:48; RD:NULL;上:[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,

以下是我需要从中获取的部分:

  

C:\ Windows \ WinSxS \ amd64_3ware.inf.resources_31bf3856ad364e35_10.0.10130.0_en-us_ca9e7cc7a071e60f来自此字符串

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

1 个答案:

答案 0 :(得分:2)

RegEx为此类事物提供了极大的灵活性,但您需要建立一个定义路径开始和结束位置的已知模式。例如,如果它始终以on:[100]"\??\作为前缀并始终以";结尾,那么您可以使用此RegEx模式提取它:

  

上:[100]? “\\?\ \(。*?)”;

这是模式的含义:

  • on:\[100\]"\\\?\?\\ - 匹配必须以on:[100]"\??\开头
    • 额外的反斜杠是逃避所有特殊字符所必需的特殊字符所必需的。在这种情况下,[]\?对RegEx都有特殊含义,因此每个都需要在反斜杠之前进行转义以逃避它们。< / LI>
  • (.*?) - 匹配可以包含前面的on:[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模式找到它。另外,由于模式本身只是一个字符串,因此它也可以存储在代码之外的配置设置中,这是一个额外的好处。