Vb.net 从文本中提取目录字符串
我有一个用visual basic 2010制作的程序,该程序将提取损坏文件的日志,并向用户提供损坏文件的位置以进行修复。这些日志非常庞大,根据损坏的程度而有所不同 我已经在代码中设置了只提取标记为错误的文本行,但是在这些行中,有指向文件损坏的目录。我需要知道是否有办法读取这些目录并将它们放入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
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作为字符串读取,然后将您的正则表达式更改为用户将其更改为的任何值。如果不看到各种条目,很难知道如何修复该模式。不过,我将对模式的各个部分的含义进行解释。