2014-01-09 63 views
0

我正在創建一個應用程序,它能夠告訴我誰在登錄到製造中心的PC上工作。VB.Net:正則表達式

我使用psexec的psloggedon cmd進程爲我提供了有關我和VB.net Windows應用程序的信息,以向我顯示信息。

我首先查詢所有PC的數據庫,我們當前有活動並將數據轉儲到datagridview對象中。 (如下圖所示)

Private Sub Button(sender As System.Object, e As System.EventArgs) Handles btngetPC.Click 

    'GET AREAS FROM DATABASE 
    Dim ds As New DataSet() 
    Dim db As String = "QUERY STRING GOES HERE" 

    'CONNECT TO DATABASE 
    Using da As New SqlDataAdapter(db, MySQLConnection) 
     da.Fill(ds, "MACHINE_NAME") 
    End Using 
    With datagridView1 
     .DataSource = ds.Tables("MACHINE_NAME") 
    End With 

    'ADD COLUMN TO DATAGRIDVIEW 
    datagridView1.Columns.Add("LOGGED_IN", "LOGGED_IN") 
    MySQLConnection.Close() 
End Sub 

一旦我有我的DataGridView對象填寫了我的所有活動PC的,然後我就可以使用計算機名來運行psloggedon CMD得到誰在登錄我使用這樣做:

Private Sub execute(sender As Object, e As EventArgs) Handles bntExecuteCmd.Click 

    'COUNT ENTRIES 
    Dim RowCount As Integer = datagridView1.RowCount 
    ''EXECUTE CMD 
    For i = 0 To RowCount - 2 
     'PERFORM PSLOGGEDON ROUTINE 
     Dim Proc1 As New Process 
     Proc1.StartInfo = New ProcessStartInfo("psloggedon") 
     Proc1.StartInfo.Arguments = "-l \\" & datagridView1.Rows(i).Cells(1).Value & "" 
     Proc1.StartInfo.RedirectStandardOutput = True 
     Proc1.StartInfo.UseShellExecute = False 
     Proc1.StartInfo.CreateNoWindow = True 
     Proc1.Start() 

     If Not Proc1.WaitForExit(300) Then 
      Proc1.Kill() 
     End If 

     'INSERT RESULTS INTO LOGGEN_IN COLUMN 
     Dim msg As String = Proc1.StandardOutput.ReadToEnd 
     Dim idx As Integer = msg.LastIndexOf("\"c) 
     Dim user As String = msg.Substring(idx + 1) 
     Dim final As String = UCase(System.Text.RegularExpressions.Regex.Replace(user, "^ELP.*$", "")) 
     datagridView1.Rows(i).Cells(2).Value = final 
    Next 
End Sub 

最後,這裏是我的問題:
要獲得監守RAW格式是不能接受的,我必須使用正則表達式的員工姓名。

原始格式:
「連接到\ ELPSC171698的註冊...

用戶本地登錄: ECHOSTAR \ Jane.Doe」 申請後

格式:

'INSERT RESULTS INTO LOGGEN_IN COLUMN 

     Dim msg As String = Proc1.StandardOutput.ReadToEnd 
     Dim idx As Integer = msg.LastIndexOf("\"c) 
     Dim user As String = msg.Substring(idx + 1) 
     Dim final As String = UCase(System.Text.RegularExpressions.Regex.Replace(user, "^ELP.*$", "")) 
     datagridView1.Rows(i).Cells(2).Value = final 

「PAULA.RODRIGUEZ」

看起來不錯,對嗎?然而,當原始格式有一個以上的聯營公司,像這樣:

「連接到\ ELPSC173068的註冊...

用戶本地登錄: ECHOSTAR \ John.Doe ECHOSTAR \ Ben.Doe 「

我寫的代碼會讓我成爲這個列表中的最後一個人。在這種情況下,當我需要BEN.DOE時,我會得到JOHN.DOE。

現在的問題:我怎樣才能改變這種代碼:

'INSERT RESULTS INTO LOGGEN_IN COLUMN 

     Dim msg As String = Proc1.StandardOutput.ReadToEnd 
     Dim idx As Integer = msg.LastIndexOf("\"c) 
     Dim user As String = msg.Substring(idx + 1) 
     Dim final As String = UCase(System.Text.RegularExpressions.Regex.Replace(user, "^ELP.*$", "")) 
     datagridView1.Rows(i).Cells(2).Value = final 

要得到我的第一人, 「JOHN.DOE」 從這裏開始:

「連接到\ ELPSC173068的註冊.. 。

用戶本地登錄: ECHOSTAR \ John.Doe ECHOSTAR \ Ben.Doe」

我希望我的問題是明確的一個很好建造。謝謝。

回答

0

使用更具體的正則表達式和捕獲組來獲取多個項目。

Dim mc As MatchCollection = Regex.Matches("Users logged on locally: ECHOSTAR\John.Doe ECHOSTAR\Ben.Doe", "[\t ]+[a-z_0-9]+\\(?<n>[a-z_\.0-9]+)(([\t ])|($))", RegexOptions.ExplicitCapture Or RegexOptions.IgnoreCase Or RegexOptions.Multiline) 
    For Each m As Match In mc 
     Dim name As String = m.Groups("n").value 
    Next 

如果你只是想第一個然後......

If mc.Count >= 1 Then 
    Dim name As String = mc(0).Groups("n").Value 
End If 
0

變化

Dim idx As Integer = msg.LastIndexOf("\"c) 

Dim idx As Integer = msg.IndexOf("\"c) 

或者可以這樣考慮:

假設您已經驗證第一串。

Dim user As String = msg.Split({"\"c, " "c}, StringSplitOptions.RemoveEmptyEntries)(1) _ 
        .Replace("."c, " "c).ToUpper 

離開小數中只是刪除.Replace("."c, " "c)