我正在使用 Visual Basic 2010 制作一个程序,该程序将提取损坏文件的日志并向用户提供损坏文件的位置以修复它。这些日志非常巨大,并且根据损坏的数量而变化。
我已经在代码中设置为仅提取标记为错误的文本行,但是在这些行中,有一些目录指向损坏的文件。我需要知道是否有任何方法可以读取这些目录并将它们放入 RichTextBox
中。以下是日志文件中的一行示例:
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,
这是我需要从中提取的部分:
C:\Windows\WinSxS\amd64_3ware.inf.resources_31bf3856ad364e35_10.0.10130.0_en-us_ca9e7cc7a071e60f from this string
我对这一切都很陌生,所以请耐心等待。
最佳答案
正则表达式为此类事情提供了极大的灵活性,但您需要建立一个已知的模式来定义路径的开始和结束位置。例如,如果它始终以 on:[100]"\??\
为前缀,并且始终以 ";
结尾,那么您可以使用以下正则表达式模式提取它:
on:[100]"\\?\?\(.*?)";
该模式的含义如下:
on:\[100\]"\\\?\?\\
- 匹配项必须完全以on:[100]"\??\
开头- 额外的反斜杠是转义所有特殊字符所必需的,否则这些特殊字符将具有特殊含义。在本例中,
[
、]
、\
和?
对 RegEx 都有特殊含义,因此它们各自需要在前面加上反斜杠来转义它们。
- 额外的反斜杠是转义所有特殊字符所必需的,否则这些特殊字符将具有特殊含义。在本例中,
(.*?)
- 匹配项可以包含前面的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 模式找到它。附带说明一下,由于模式本身只是一个字符串,因此它也可以存储在代码外部的配置设置中,这是一个额外的好处。
关于vb.net - 从文本中提取目录字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31463271/