我試圖使用命名組來解析一個字符串。如何在C#.NET正則表達式中捕獲命名組?
一個例子輸入:
exitcode: 0; session id is RDP-Tcp#2
和我嘗試正則表達式是:
("(exitCode)+(\s)*:(\s)*(?<exitCode>[^;]+)(\s)*;(\s)*(session id is)(\s)*(?<sessionID>[^;]*)(\s)*");
哪裏是我的語法錯誤?
感謝
我試圖使用命名組來解析一個字符串。如何在C#.NET正則表達式中捕獲命名組?
一個例子輸入:
exitcode: 0; session id is RDP-Tcp#2
和我嘗試正則表達式是:
("(exitCode)+(\s)*:(\s)*(?<exitCode>[^;]+)(\s)*;(\s)*(session id is)(\s)*(?<sessionID>[^;]*)(\s)*");
哪裏是我的語法錯誤?
感謝
在您的例子:
exitcode: 0; session id is RDP-Tcp#2
它不以分號結束,但它似乎正則表達式需要一個分號,以紀念會話ID的結尾:
(?<sessionID>[^;]*)
我注意到,緊跟着你的兩個命名組,你有可選的空白匹配 - 可能會有助於將空白添加到字符類中,如下所示:
(?<exitCode>[^;\s]+)
(?<sessionID>[^;\s]*)
更好的是,首先將字符串分割爲分號,然後可能甚至不需要正則表達式。你有這兩個子拆分在分號之後,並退出碼和SessionID的恰巧是在弦的兩端,因此很容易分析他們的任何數量的方式:
exitcode: 0
session id is RDP-Tcp#2
理查德答案真的已經涵蓋了它 - 要麼刪除或在最後選擇分號,它應該工作,並且肯定考慮把空格放在否定類中,或者只是在分號上分割,但是需要額外的思考。 :)
不要\ 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*$')
取決於誰將維護代碼,這可能被認爲比以上表達式更具可讀性。
如果您發佈的是代碼或XML,**請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼」按鈕(101 010),以良好地格式化和語法突出顯示它! – 2010-07-08 21:07:05
你有什麼試過的?你的C#代碼是什麼樣的?什麼是問題 - 你會得到一個錯誤(如果是這樣的話:它是什麼?)或者它只是不返回任何數據,或者是什麼? – 2010-07-08 21:07:50
你需要捕獲哪些組?退出代碼和會話ID? – DonaldRay 2010-07-08 21:08:08