2009-10-20 27 views
1

即時通訊試圖瞭解正則表達式,以及如何使用它制止索姆日誌和填充索姆文本框的結果。一個簡單的正則表達式問題

,如果我有一個簡單的線條像這樣

端口狀態:TRO-S-02-AV1 0/23

,並希望把該TRO-S-02-AV1和0/23在一個變量中

所有名字都會在av1上結束,因此定期展開應該基於此。

我在想這樣試圖讓tro-S-02-av1的字符串成爲一個文本框的值,但是我無法正確理解它,我該怎麼做。

Regex r; 
    Match m; 

    r = new Regex("$`\av1"); 
    m = r.Match("Port status: tro-S-02-av1 0/23"); 

    nodetbx.Text = m.Value; 

回答

2

使用羣組進行以下的正則表達式(例如,你也許可以打掃一下)

Port status: (?<ID>[\d\w\-]+)\s(?<ID2>[\s\S]+) 

給你兩個命名組,ID1和ID2然後就可以填充。

我發現使用命名組更容易,當第一次學習正則表達式,所以你可以真正看到發生了什麼。

看看nregex來幫助練習和測試正則表達式。

regex r = new regex("Port status: (?<ID>[\d\w\-]+)\s(?<ID2>[\s\S]+)"); 
    matchcollection mc = r.matches(MyText); 
    foreach (match m in mc) { 
     string ID1 = m.groups("ID1"); 
     string ID2 = m.groups("ID2"); 
    } 

其中MyText是每行使用ReadLine循環遍歷文件或整個文件,如果不是太大。

然後,您可以使用ID1和ID2(重新命名爲有意義的內容)來填充文本框或其他內容。

+0

很好的幫助,那個網站看起來不錯,但是那條線讓我更加困惑,我該如何使用ID和ID2? – Darkmage 2009-10-20 10:59:20

+0

根據您是逐行處理還是作爲批處理進行處理,您可以遍歷集合中的每個匹配,然後從每個匹配中獲取組。 我不做很多C#所以不能寫代碼完美的我的頭頂,但... regex r = new regex(「REGEX」);matchcollection mc = r.matches(MyText); foreach(m中的匹配m){ string ID1 = m.groups(「ID1」); string ID2 = m.groups(「ID2」); } – 2009-10-20 11:07:06

+0

很好的幫助:)謝謝 – Darkmage 2009-10-20 11:08:15

1

對於這個特殊的項目,你可以使用分割字符串的方法

string[] words = s.Split(' '); 

使用ArrayList中的第2個和第3個值。

+0

是的好點,但它只是一個樣本最後的日誌是數百行大,不同的信息 – Darkmage 2009-10-20 10:46:47

+0

然後它確實沒用:) – Rickjaah 2009-10-20 10:47:42

+0

真正的這個例子將分裂字符串,並會打破與上面正則表達式的例子完全一樣,它的確取決於你期望看到的可能值的範圍 - 空間是否總是在相同的地方等等。 如果格式總是如上,那麼保持簡單與字符串,如果它會/可能會改變 - 正則表達式可能是你最好的選擇。 – 2009-10-20 10:47:46