我有一个程序,我正在使用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来自此字符串
我对这一切都很陌生,所以请耐心等待。
答案 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模式找到它。另外,由于模式本身只是一个字符串,因此它也可以存储在代码之外的配置设置中,这是一个额外的好处。