2016-11-03 10 views
1

Ich habe eine schreckliche Zeit mit regulären Ausdrücken, so dass ich in der Regel auf lausige Kludges und Workarounds zurückgreifen, wenn ich Strings analysiere. Ich muss besser werden, Regex zu verwenden. Dieser scheint mir einfach zu sein, aber ich weiß nicht einmal, wo ich anfangen soll.Den Anfang und das Ende eines Teilstrings finden mit regex

Hier ist die String-Ausgabe von meinem Gerät:

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

Beispiel: Ich mag finden, wenn das Gerät ein- oder ausgeschaltet ist. Ich muss nach der Zeichenfolge "Enable:" suchen, dann den Wagenrücklauf suchen und bestimmen, ob das Wort zwischen Enable: und \ r aus ist oder nicht. Es scheint so zu sein, für was Regex ist, oder verstehe ich es total falsch.

Kann mir jemand in die richtige Richtung zeigen?

Zusätzliche Informationen - Vielleicht muss ich auf die Frage erweitern.

Anhand der Antworten scheint es ziemlich einfach zu sein, festzustellen, ob das Gerät aktiviert ist oder nicht. Da eine Rückgabezeichenfolge einem Schlüssel/Wert-Paar ähnelt, ist es ärgerlicher, den Teilstring zwischen dem: und dem Wagenrücklauf zu bestimmen. Eine Anzahl dieser Paare hat eine Antwort mit Längen, die sich erheblich unterscheiden, z. B. DeviceLocation, DeviceName, IPAddress. Tatsächlich antwortet das Gerät auf jeden gesendeten Befehl, indem es die gesamte Statusliste, 48 Schlüssel/Wert-Paare, zurückgibt, die ich dann analysieren muss, selbst wenn ich nur eine Eigenschaft kennen muss.

Auch basierend auf Ihren Antworten .... Reguläre Ausdrücke ist nicht der Weg zu gehen.

Danke für jede Hilfe. Norm

+0

Warum müssen Sie die unnötige Komplexität einer Regex zu diesem einfachen Problem hinzufügen? Verwenden Sie IndexOf, um * Enable: * zu suchen, und verwenden Sie dann SubString basierend auf dieser Indexposition + Length ('Enable:'), um zwei Zeichen zu lesen, die * On * oder * Of * sind. –

+0

Wenn Sie denken, dass dies eine Möglichkeit ist, dann versuchen Sie es. Beim Posten auf SO sollten Sie konkrete Codebeispiele angeben und danach fragen, nicht in der Luft. –

+0

In der Tat, da es sich um eine einfache Zeichenfolge handelt, ist es noch einfacher. Wenn Sie wissen, dass es immer * Enable: * und entweder * On * oder * Off * enthält, verwenden Sie einfach IndexOf (': On') '. Wenn das Ergebnis> 0 ist, ist es aktiviert. Wenn es 0 ist, ist es nicht. Erledigt. Eine kurze Codezeile. –

Antwort

-1

Betrachten Sie den folgenden Code ein:

// 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

Beachten Sie, dass Ihre Eingabe dies hat Extra Leerzeichen, vermutlich vom Einfügen 'IP: 192.168.5.210 \ rPlaylist: 1 \ rEnable: On \ rMode: HDMI \ rLineIn: Unbal \ r' in Visual Studio, * dann * die Anführungszeichen hinzufügen. Wenn Sie mit den Anführungszeichen beginnen und sie einfügen, werden keine Leerzeichen hinzugefügt. – Quantic

3

Ich würde für eine einfache Linie als für den einen oder anderen gezeigt, fragen, sondern auch überprüfen. Basiert teilweise auf den Vorschlägen von Ken White.

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

Dies setzt voraus, dass „: Ein“ und „: Aus“ nirgendwo sonst in der Zeichenfolge, auch mit einer anderen Zeichenfolge erscheinen.

Verwandte Themen