2010-07-08 29 views
-1

我試圖使用命名組來解析一個字符串。如何在C#.NET正則表達式中捕獲命名組?

一個例子輸入:

exitcode: 0; session id is RDP-Tcp#2 

和我嘗試正則表達式是:

("(exitCode)+(\s)*:(\s)*(?<exitCode>[^;]+)(\s)*;(\s)*(session id is)(\s)*(?<sessionID>[^;]*)(\s)*"); 

哪裏是我的語法錯誤?

感謝

+0

如果您發佈的是代碼或XML,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010),以良好地格式化和語法突出顯示它! – 2010-07-08 21:07:05

+0

你有什麼試過的?你的C#代碼是什麼樣的?什麼是問題 - 你會得到一個錯誤(如果是這樣的話:它是什麼?)或者它只是不返回任何數據,或者是什麼? – 2010-07-08 21:07:50

+0

你需要捕獲哪些組?退出代碼和會話ID? – DonaldRay 2010-07-08 21:08:08

回答

3

在您的例子:

exitcode: 0; session id is RDP-Tcp#2 

它不以分號結束,但它似乎正則表達式需要一個分號,以紀念會話ID的結尾:

(?<sessionID>[^;]*) 

我注意到,緊跟着你的兩個命名組,你有可選的空白匹配 - 可能會有助於將空白添加到字符類中,如下所示:

(?<exitCode>[^;\s]+) 
(?<sessionID>[^;\s]*) 

更好的是,首先將字符串分割爲分號,然後可能甚至不需要正則表達式。你有這兩個子拆分在分號之後,並退出碼和SessionID的恰巧是在弦的兩端,因此很容易分析他們的任何數量的方式:

exitcode: 0 
session id is RDP-Tcp#2 
0

理查德答案真的已經涵蓋了它 - 要麼刪除或在最後選擇分號,它應該工作,並且肯定考慮把空格放在否定類中,或者只是在分號上分割,但是需要額外的思考。 :)


不要\ S打擾它是沒有必要的 - 看起來像你的輸出是某種形式的日誌之類的東西,所以應該更容易預測,如果這樣簡單的東西可以做:

exitcode: (?<exitCode>\d+);\s+session id is\s+(?<sessionID>[^;\s]*);? 


有關分號分割,你會得到兩個對象的數組 - 這裏的一些僞代碼,假設退出碼是數字和會話ID沒有空格:

splitresult = input.split('\s*;\s*') 
exitCode = splitresult[0].match('\d+') 
sessionId = splitresult[1].match('\S*$') 

取決於誰將維護代碼,這可能被認爲比以上表達式更具可讀性。

相關問題