2016-11-12 5 views
0

Also ich bin im Vergleich Strings mit dem folgenden Muster:Verwirrung über Mustervergleich in Java

"\"([a-zA-Z]*)\"" 

Bin ich richtig in das Denken bedeutet, dass es erlaubt, nur für Strings, die haben:

  • Genau ein Anführungszeichen am Anfang - \ ",
  • Genau ein Anführungszeichen am Ende, - \" - und;
  • Ein beliebige Anzahl von entweder klein oder Großbuchstaben dazwischen - ([a-zA-Z] *)

Ich frage dies, weil das ist, was ich nach dem Scheuern sowohl Stackoverflow zu dem Glauben verleitet worden, und das Internet. Aber die Methode "matches()" wirft keine PatternSyntaxException, wenn ich ihr eine leere Zeichenfolge gebe. Was ich damit meine ist:

|""| //This is valid or is meant to be 

|| //This is invalid or is meant to be 

Wer kümmert sich um mich aufzuklären? Für den Kontext ist dies in Java.

Bearbeiten: Hi all, die Zeichenfolge, die ich mit der Regex übereinstimmt, hat Anführungszeichen (Ich frage den Benutzer, eine Nachricht in Anführungszeichen eingeschlossen). Der Code, den ich zu schreiben versuchen ist:

if(!(components[MESSAGE].matches("^\\"([a-zA-Z]*)$\\""))) 
      throw new InvalidSyntaxException(" > ERROR: Message must be surrounded by quotation marks."); 

Wo InvalidSyntaxException 'eine benutzerdefinierte Ausnahmeklasse ist.

Einige Beispiele:

|""| - valid 
|| - invalid (quotes required) 
|"Example"| - valid 
|"The year is 1995"| - invalid (no numbers) 

GELÖST: Sie waren in Ordnung - die mein Code einzige, was nicht war tat Räume innerhalb der Nachricht ermöglichen! Deshalb beschwerte er sich ständig. Danke noch einmal!

+2

Ich bin nicht sicher, warum Sie würden denken, dass 'matches()' sollte eine Ausnahme werfen. Dies geschieht nur bei einem ungültigen Muster, nicht wenn es nicht mit der Zeichenkette übereinstimmt. Jede Zahl enthält auch keine, also ist "" eine gültige Übereinstimmung. – UnholySheep

+2

Sie müssen den 'boolean' Rückgabewert von' matches' prüfen, keine Ausnahme erwarten. Die Ausnahme wird nur ausgelöst, wenn - wie der Name sagt - die Syntax der Regex schlecht ist. Ihre Syntax sieht gut aus. – Gene

+0

@Gene, was ist dann der Unterschied zwischen fehlerhafter Syntax und fehlgeschlagener Syntax? Wie in, einfach "falsch" zu sein, anstatt eine Ausnahme zu werfen. –

Antwort

1

Sie könnten die " an beiden Enden der Regex entfernen möchten:

\"([a-zA-Z]*)\" 

Ich würde vorschlagen, Sie regex101 zu benutzen, um Ihre regex zu testen.

EDIT: Wie in anderer Antwort sagte, müssen Sie das Muster kompilieren, bevor es mit:

Pattern pattern = Pattern.compile("\"([a-zA-Z]*)\"") 
if(!pattern.matches(components[MESSAGE])) 
     throw new InvalidSyntaxException(" > ERROR: Message must be surrounded by quotation marks."); 
+0

Hallo, ich wollte Zitate hinzufügen! –

+0

Meinst du, du willst "" string "' oder "" string "" ''? –

+0

Siehe bearbeiten, um Ihre Frage zu beantworten! –

1

Um \" am Ende einen Anfang des Strings zu behaupten, verwendet ^ und $:

^\"([a-zA-Z]*)\"$ 

Dies sollte nur Übereinstimmungen finden, die mit " beginnen und enden.

+0

Ich fürchte, ich habe es gerade erst ausprobiert und nein, Glück! Es besteht immer noch den Test. –

+0

Auch das Umbrechen von THAT Regex in Anführungszeichen wirft Beschwerden aus Java. Die folgende Zeile ist ungültig: String regex = "^ \\" ([a-zA-Z] *) $ \\ ""; –

+0

@DanielSoutar yeah das war ein Fehler – ItamarG3

1

So wird PatternSyntaxException geworfen "um einen Syntaxfehler in einem regulären Ausdruck-Muster anzuzeigen." Ich erwarte nicht, dass du es bekommen kannst, indem du gegen einen leeren String klickst.

Haben Sie vielleicht die Argumente umgekehrt? (Sie haben Ihren Code nicht veröffentlicht.)

Sie sollten Ihre Regex an Patter.compile() übergeben. Dann übergeben Sie die Zeichenfolge, die Sie auschecken möchten ...

myPattern.matcher("my_string").matches(); 

Oder wenn Sie static boolean matches(String regex, CharSequence input) verwenden, der RegexMuster ist zuerst.

1

Im Gegensatz zu den verschiedenen Analysemethoden löst matches() keine Ausnahme aus, wenn die Eingabe nicht mit dem Muster übereinstimmt. Es gibt einfach true oder zurück.

es wie folgt verwendet:

if (input.matches("\"[a-zA-Z]*\"")) 
    // input is OK 

Beachten Sie, dass die Klammern nicht erforderlich sind (als ein führendes ^ oder einen nachlauf $ wie sie mit matches() impliziert werden würde).

+0

Eigentlich wollte ich zitieren Sie Anführungszeichen. So "" wäre gültig. –

+0

@dan OK dann. Siehe redigierte Antwort für, was ich denke, dass Sie vermissen. – Bohemian

0

Hoffe, dieser Code ist hilfreich.

public class Foo { 
    static void check(String s) { 
    System.out.println("Match |" + s + "| = " 
     + Pattern.matches("\"([a-zA-Z]*)\"", s)); 
    } 

    public static void main(String[] args) { 
    check("\"foo\""); // Should be true 
    check("\"123\""); // Should be false 
    check("\"\""); // should be true 
    check("foo"); // Should be false 
    check(""); // Should be false 
    } 
} 

Er druckt

Match |"foo"| = true 
Match |"123"| = false 
Match |""| = true 
Match |foo| = false 
Match || = false