正则表达式忽略文件路径驱动器号冒号

时间:2013-11-18 18:25:51

标签: regex vb.net

我一直在测试这种模式:

Dim argumentsPattern As String = "/(?<var>.+):(?<val>.+)"

字符串看起来很好用:

/import-machinelist:Computers.txt

但是当字符串包含文件路径时,第二个冒号会破坏模式。

/import-machinelist:C:\Users\Administrator\Desktop\WinZooka\WinZooka\bin\Debug\computers.txt

如何修复模式以忽略第二个冒号?

这是我正在使用的vb.net代码。

Dim commandLineArgs() As String = Environment.GetCommandLineArgs()
        Dim argumentsPattern As String = "/(?<var>.+):(?<val>.+)"
        Dim localRegex = New Regex(argumentsPattern, RegexOptions.IgnoreCase)

        For Each arg As String In commandLineArgs

            If arg = "/?" Then

                MsgBox("Command line variables:" & Chr(13) & Chr(10) & _
                        "/username:JohnDoe" & Chr(13) & Chr(10) & _
                        "/password:Password1" & Chr(13) & Chr(10) & _
                        "/domain:lab.com" & Chr(13) & Chr(10) & _
                        "/import-machinelist:Computers.txt" & Chr(13) & Chr(10))

            Else
                Dim localMatch As Match = localRegex.Match(arg)
                If localMatch.Success Then

                    Select Case localMatch.Groups("var").ToString
                        Case "username"
                            txtUser.Text = localMatch.Groups("val").ToString
                        Case "password"
                            txtPass.Text = localMatch.Groups("val").ToString
                        Case "domain"
                            txtDomain.Text = localMatch.Groups("val").ToString
                        Case "import-machinelist"
                            importMachineList(localMatch.Groups("val").ToString)
                    End Select

                End If
            End If

        Next

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果\后面没有{ - 1>},则可以使用与冒号匹配的负向lookbehind:

\/(?<var>.+):(?!\\)(?<val>.+)

不确定它是否涵盖了您的所有情况。

答案 1 :(得分:0)

尝试将分隔符更改为分号(;),然后您可以使用正则表达式或拆分参数,如下所示:

带分号的正则表达式:

Dim argumentsPattern As String = "/(?<var>.+);(?<val>.+)"

以分号分隔参数字符串:

Dim argSplit As String() = arg.Split(';')

Select Case argSplit(0)
    Case "username"
        txtUser.Text = localMatch.Groups("val").ToString
    Case "password"
        txtPass.Text = localMatch.Groups("val").ToString
    Case "domain"
        txtDomain.Text = localMatch.Groups("val").ToString
    Case "import-machinelist"
        importMachineList(localMatch.Groups("val").ToString)
End Select

答案 2 :(得分:0)

您可以通过添加?

来使第一个匹配组非贪婪
Dim argumentsPattern As String = "/(?<var>.+?):(?<val>.+)"

这意味着它只捕获到第一个冒号之前。