2016-03-29 4 views
-1

Zum BeispielEine Regex zum Extrahieren von ";" oder "=" Symbolen aus dem Quellcode?

int val = 13; 

Serial.begin(9600); 

val = DigitalWrite(900,HIGH); 

Ich möchte wirklich spezielle Symbole wie = und ; extrahieren.

Ich konnte Symbole extrahieren, die im Code nebeneinander erscheinen, aber ich brauche alle Vorkommen.

Ich versuchte [^ "//"A-Za-z\t\n0-9]* und [\;\=\{\}\,]+. Keine funktionierte.

Was ist los?


i wie unten eine Regel für meinen Scanner gemacht hatte (hatte geändert)

Semikolon [;]. ([\ N] | [^ "//"])

Zuordnung [=] +

Klammer ([{] | [}]) (.)? ([\ n] | [^ "//"])

roundbarcket ("()")“"

das Problem m wie diese Situationen aufgetreten ist

  1. int val = 13; // es konnte "=" nicht erkennen, weil "val" und "=" angefügt sind. ich möchte sie entweder angrenzen oder nicht erkennen

  2. serial.read(); // es konnte nicht erkennen() und; mit individuell. Wenn ich eine Semikolonregel und eine Rundstabregel hinzufüge,(); wurde erkannt.

wie kann ich sie lösen?

+0

Wenn Sie ein einzelnes Zeichen erkennen möchten, verwenden Sie keine Wiederholungsoperatoren ('*' oder '+'). Nur '[...]' entspricht einem Zeichen. Außerdem müssen Sie keine Backslash-Escape-Zeichen in einer Zeichenklasse außer Backslash verwenden. So ist '[; = {},]' in Ordnung, um einem dieser Zeichen zu entsprechen (und, wie gesagt, '[; = {},] + 'wird mit einer beliebigen Anzahl solcher Zeichen übereinstimmen, so dass es der Zeichenkette' entspricht }; als ein einzelnes Token. – rici

+0

Ich versuchte [; = {}], aber es gab eine Warnung. - Kann nicht richtig finden Ich habe mit Teilung Token kämpfen. zum Beispiel int val = 13; Fall war Erfolg int val = 13; Fall war nicht erfolgreich wie kann ich sie teilen? –

+0

Ich denke, Sie müssen mehr von Ihrer Scannerdefinition zeigen und Ihre Anforderungen klarer beschreiben. – rici

Antwort

0

Also Suche nach ";" und "=" ist das ultimative Ziel, das Sie erreichen möchten? In einem solchen Fall, warum verwenden Sie nicht einfach so etwas wie .find() Funktion? Oder Sie können Strings durch ";" zuerst und suche nach "=" danach.

Wenn Sie Text wollen zwischen "=" packen und ";", versuchen Sie verwenden =([^;]*); oder =(.*?);

+0

zweite Methode, die Sie vorgeschlagen haben, hat nicht funktioniert .. Ultimate Ziel ist extrahieren spezielle Symbol. val = DigitalWrite (900, HIGH); hier möchte ich teilen); zu und ; Das ist das ultimative Ziel. oder ein anderes spezielles Symbol! –

+0

meinst du Split DigitalWrite (900, HIGH); in "DigitalWrite" ("900", "HOCH") ""; "? Gib uns mehr Details, Mann. – DVN

+0

Ja, das stimmt! oder DigitalWrite (900, HOCH); in "DigitaWrite" ";" aber ich möchte es teilen, was Sie sagten, ich meine, detaillierter. Ich habe versucht, eine Kennung, eine Ziffer, ein Sonderzeichen, einen Kommentar aus dem Quellcode zu erkennen! –

2

Sie wollen brechen "digital (900, HIGH);" in "DigitalWrite" ("900", "HIGH") ""; ". Ich denke, jede Teilkette zu loopen ist der schnellste Weg.

 string text = "val = DigitalWrite(900,HIGH);"; 
     string[] symbols = new string[] { "(", ")", ",", "=", ";"}; 
     List<string> tokens = new List<string>(); 
     string word = ""; 
     for(int i = 0; i < text.Length; i++) 
     { 
      string letter = text.Substring(i, 1); 
      if(!letter.Equals(" ")) 
      { 
       if(tokens.Contains(letter)) 
       { 
        if(word.Length > 0) 
        { 
         tokens.Add(word); 
         word = ""; 
        } 
        tokens.Add(letter); 
       } 
       else 
       { 
        word += letter; 
        if(i == text.Length - 1) 
         tokens.Add(word); 
       } 
      } 
     } 
+0

vielen Dank. Aber gibt es einen Weg, sich durch Regex zu teilen? –