2016-11-03 91 views
1

正常表達式的使用非常糟糕,所以我通常在解析字符串時使用糟糕的方法和解決方法。我需要更好地使用正則表達式。這對我來說似乎很簡單,但我甚至不知道從哪裏開始。使用正則表達式查找子字符串的開始和結尾

下面是從我的設備輸出的字符串:

testString = IP:192.168.5.210\rPlaylist:1\rEnable:On\rMode:HDMI\rLineIn:unbal\r 

例子: 我想找到該設備是否開啓或關閉。我需要搜索字符串「Enable:」,然後找到回車符並確定Enable:和\ r之間的詞是關閉還是打開。看來這就是正則表達式的用途,或者我完全誤解了它。

有人能指出我正確的方向嗎?

更多信息 - 也許我需要擴大這個問題。

根據答案,查找設備是否啓用看起來相當簡單。因爲我得到一個返回字符串類似於一個鍵/值對,更令人煩惱的是確定:和回車之間的子字符串。許多這些對具有顯着不同的長度的響應,例如DeviceLocation,DeviceName,IPAddress。實際上,設備通過返回整個狀態列表(48個鍵/值對)來響應發送給它的每個命令,然後我必須解析該列表,即使我只需要知道一個屬性。

也基於你的回答....正則表達式不是要走的路。

感謝您的任何幫助。 規範

+0

爲什麼你需要添加一個正則表達式的不必要的複雜性到這個簡單的問題?使用IndexOf定位* Enable:*,然後使用基於該索引位置+ Length('Enable:')的SubString讀取兩個字符,它們將是* On *或* Of *。 –

+0

如果您認爲這是一種方法,那就試試吧。當在SO上發佈時,您應該提供具體的代碼示例並且詢問,而不是在空中。 –

+0

事實上,由於你正在處理一個簡單的字符串,它更簡單。如果您知道它將始終包含* Enable:*和* On *或* Off *,只需使用'IndexOf(':On')'。如果結果大於0,則啓用;如果它是0,那不是。完成。一小段代碼。 –

回答

-1

考慮下面的代碼:

// This regular expression matches text 'Enabled: ' followed by one or more non '\r' followed by '\r' 
// RegexOptions.Multiline is optional but MAY be necessary on other platforms. 
// Also, '\r' is not a line break. '\n' is. 
Regex regex = new Regex("Enable: ([^\r]+)\r", RegexOptions.Multiline); 

string input = "IP:192.168.5.210\rPlaylist: 1\rEnable: On\rMode: HDMI\rLineIn: unbal\r"; 

var matches = regex.Match(input); 
Debug.Assert(matches != Match.Empty); 

// The match variable will contain 2 Groups: 
// First will be 'Enabled: On\r' 
// The other is 'On' since we enclosed ([^\r]+) in(). 
Console.WriteLine(matches.Groups[1]); 
+2

請注意,您的輸入有額外的空間,大概是粘貼'IP:192.168.5.210 \ rPlaylist:1 \ rEnable:開啓\ rMode:HDMI \ rLineIn:unbal \ r'進入visual studio,然後*添加引號。如果您以引號開頭並粘貼到它們中,則不會添加空格。 – Quantic

3

我建議一個簡單的線如圖所示,要求一方或另一方,但要驗證爲好。部分基於Ken White的建議。

if(input.Contains(":On")){ 
    //DoWork() 
}else{ 
    if(input.Contains(":Off")) 
     //DoOtherWork 
} 

這假設「:在」和「:關閉」將不會出現其他地方在字符串中,即使使用不同的字符串。

相關問題