2017-12-05 20 views
0

Ich muss einen regulären Ausdruck erstellen, der in die Methode Pattern.compile (regex) eingefügt wird; Meine Regex muss Integer (ohne 0 am Anfang der Zahl), eine Folge von Zahlen und Char (A-Za-z) erlauben, aber das Problem ist der dritte Punkt: eine Zeichenfolge, die mit dem Zeichen beginnen und enden muss '' ', muss die Zeichen Backslash (sofern es nicht einen anderen Backslash gibt) und das Zeichen' '' (sofern nicht vor einem Backslash)Regulärer Ausdruck der Methode Pattern.compile()

aber ich verstehe nicht, wie man den zweiten Punkt (ich habe eine Menge Fehler) erfüllt, das ist mein Java-Code:

public static void main(String[] args) { 
    if (args.length == 0) 
     throw new IllegalArgumentException(); 
    Matcher matcher = Pattern.compile("([a-zA-Z]+[0-9a-zA-Z_]*)|" 
      + "(0(?![0-9])|([1-9]+)([0-9]*))|" //"?!" è una asserzione : " se la condizione tra parentesi è vera non considerare lo zero 
      + "([\"]{1}(([\\\\][^\"\\][\\\"])*)[\"]{1})" 
      + "|(\\s+)").matcher(args[0]);// \s = [ \t\n\x0B\f\r] 
    System.out.println("Input: " + args[0]); //println va a capo dopo la stampa 
    while (matcher.lookingAt()) { 
     System.out.print("Lexeme '" + matcher.group() + "'"); //non va a capo dopo la stampa 
     System.out.println(" group " + ExampleLexer.getGroup(matcher)); 
     matcher.region(matcher.end(), matcher.regionEnd()); 
    } 

    //attenzione: matcher.hitEnd() restituisce true se il matcher arriva in fondo 
    //all'input anche se l'ultimo match non ha avuto successo, quindi funziona solo 
    //per espressioni regolari "semplici" 
    if (matcher.regionStart() == matcher.regionEnd()) 
     System.out.println("All lexems succesfully matched"); 
    else { 
     System.err.print("Unmatched lexem "); 
     matcher.usePattern(Pattern.compile(".*")); 
     matcher.lookingAt(); 
     System.err.println(matcher.group()); 
    } 
} 
+0

Der zweite Punkt ist "_, eine Folge von Zahlen _"? '\ d +'? Bitte geben Sie eine [MCVE] an. Eine Aufzählung für jede Anforderung wäre besser lesbar. Und natürlich haben Sie viele Fehler, erwähnen aber nicht welche. Wenn dies zu komplex ist, um besser zu erklären, dass dies zumindest ein Beispiel hinzufügen (Eingabe/Ausgabe) – AxelH

+0

danke für die Frage :) mein Problem ist der dritte Punkt! jeder String wie folgt: "\\ Hallo \" "muss \ Hallo werden", aber ich weiß nicht, wie es geht! ich meine den Backslash und die "must werden verboten, aber \\ und \" müssen einverstanden sein. – Shinon

+0

der Fehler ist: Ausnahme im Thread "main" java.util.regex.PatternSyntaxException: Unmatched Closing ')' in der Nähe von Index 89 ([a-zA-Z] + [0-9a-zA-Z _] *) | (0 (?! [0-9]) | ([1-9] +) ([0-9] *)) | (["] {1} ([(\ (? = \ | \"))] [^ \ "]) *) ["] {1}) | (\ s +) ^ \t bei java.util. regex.Pattern.error (Unbekannte Quelle) \t bei java.util.regex.Pattern.compile (Unbekannte Quelle) \t bei java.util.regex.Pattern. (Unknown Source) \t bei java.util.regex.Pattern.compile (Unknown Source) \t bei lab05_12_04.ExampleLexer.main (ExampleLexer.java:18) – Shinon

Antwort

0
"\"(\\\\.|[^\"\\\\])*\""   // (1) 
"\"(\\\\[\"\\\\]|[^\"\\\\])*\""  // (2) 
  • Zitat
  • null oder mehr Male ( ... )*
    • entweder Backslash \ gefolgt von (1) jede char ./(2) eine nicht-Zitat/non-Backslash
    • oder | kein Zitat, kein Backslash [^ ... ]
  • Zitat

Auf den Fluchten:

  1. \" ist eine String Escape, die ein Zeichen, das doppelte Zitat darstellt.
  2. \\ ist das String Escape, das einen umgekehrten Schrägstrich darstellt, ein Zeichen.
  3. \\\\ ist die Regex-Escape \\, um den Backslash selbst darzustellen, anstatt selbst eine Regex-Escape-Sequenz zu sein. Wenn Sie jemals Backslashes ersetzen möchten, versuchen Sie es zuerst ohne Regex: s = s.replace("\\", "\\\\"); verdoppelt jeden Backslash Raten Sie, wie das in Regex mit replaceAll geschrieben wird.
+0

Hallo, danke für die Antwort! aber der Backslash muss durch einen anderen Backslash oder das Zeichen "not by char!" gefolgt werden. – Shinon

+0

@Shinon so no \ t \ r \ n? Hinzugefügt Fall –

+0

genau nur \\ oder \ "sind erlaubt, wenn ich als Argument schreibe "\ Hallo" sollte die Ausgabe "nicht übereinstimmendes Lexem" sein. selbst wenn ich als argument schreiben "\\ hallo \\\\\" "sollte die ausgabe \ hallo \\ sein" – Shinon