2016-06-18 3 views
0

Ich bin ein Anfänger in diesen regulären Ausdrücken und ich konnte die Bedeutung von optionalem Vorkommen und Null oder mehr Vorkommen nicht richtig verstehen (ich benutze JavaCC reguläre Ausdrücke)Reguläre Ausdrücke: Unterschied zwischen "optionalem Vorkommen" und "null oder mehr Vorkommen"

zum Beispiel

wenn ich einen Namen wie „Datei“ übereinstimmen müssen, die auch eine Reihe enthalten kann, ich

["a"-"z"]*[0-9]? 

verwenden können, aber kann ich

["a"-"z"]*[0-9]* 

mit dem Namen "Datei" übereinstimmen, da ich "null oder mehr Vorkommen" für Zahlen verwende?

+0

Mögliche Duplikat [Referenz - Was bedeutet diese Regex?] (Http: // stackoverflow. com/questions/22937618/referenz-was-tut-das-regex-mean) –

+1

sidenteode: '[" a "-" z "] *' tut nicht, was Sie es tun wollen. Sie passen "" oder "a" oder "" mit "" oder "z" oder "" mit dieser Regex zusammen.(Beachten Sie, dass '" - "' gleich '' 'und daher unbrauchbar ist, da' "' bereits Teil der Zeichengruppe ist) Sie suchen: '[az] *' – dognose

+0

Eine Randnotiz an Diese Seitennotiz ist die Schreibweise '[" a "-" z "]' ist die richtige Art, sie in JavaCC zu schreiben. –

Antwort

1

Ein optionales Ereignis kann null oder einmalig auftreten. Dies verwendet den Operator ?.

Der * Operator kann das Auftreten auftreten null, eins, zwei, ... mal

+0

Zusätzliche Randnotiz: Beide sind standardmäßig gierig. – Jan

+0

Im Zusammenhang mit JavaCC glaube ich nicht, dass "gierig" irgendeine Bedeutung hat - zumindest wenn es auf die Operatoren * und? Angewendet wird. JavaCC sucht nach der längsten Übereinstimmung für den gesamten regulären Ausdruck. Calling '*' Greedy deutet darauf hin, dass es lokal gierig ist, möglicherweise auf Kosten der längsten Übereinstimmung weltweit. –

+0

Um meinen vorherigen Kommentar weiter zu erklären. Betrachten Sie ein RE 'a * (ab) *' und eine Zeichenkette 'aaaabababab'. In Python, mit der Funktion 're.match', stimmt der RE mit' aaaa' überein, weil das erste '*' gierig ist. In JavaCC wird jedoch die gesamte Zeichenfolge abgeglichen, da die gesamte Zeichenfolge die längste Übereinstimmung für die gesamte RE darstellt. –

0

[@ EdHeal Antwort kurz und bündig beantwortet Ihre Frage. Meine Antwort konzentriert sich darauf, Ihnen zu helfen, das zu erreichen, was Sie wollen.]

Was ist ein Dateiname?

  • Jede Zahl (einschließlich 0) von Klein englischen Buchstaben möglicherweise gefolgt von einer Ziffer: ["a"-"z"]* ["0"-"9"]?

  • eine beliebige Zahl (einschließlich 0) von Klein englischen Buchstaben von einer beliebigen Anzahl gefolgt (einschließlich 0) die Stellen: ["a"-"z"]* ["0"-"9"]*

  • Jede Zahl (einschließlich 0) von Klein englischen Buchstaben und bis zu einer Stelle überall: ["a"-"z"]* ["0"-"9"]? ["a"-"z"]*

  • Jede Zahl (einschließlich 0) von Klein englischen Buchstaben oder Ziffern: ["a"-"z","0"-"9"]*

alle oben genannten passt auf die leere Zeichenkette, die zu einer Endlosschleife führen könnte.

Wenn Sie was mindestens ein Zeichen in einem Dateinamen zu verlangen, wäre die oben jeweils

  • ["a"-"z"]+ ["0"-"9"]? | ["0"-"9"]
  • ["a"-"z"]* ["0"-"9"]+ | ["a"-"z"]+ ["0"-"9"]*
  • ["a"-"z"]+ ["0"-"9"]? ["a"-"z"]* | ["a"-"z"]* ["0"-"9"] ["a"-"z"]* | ["a"-"z"]* ["0"-"9"]? ["a"-"z"]+
  • ["a"-"z","0"-"9"]+
+0

Vielen Dank für Ihre Erklärung Theodore..Ich möchte wirklich klarstellen, bedeutet "Null oder mehr Vorkommen", dass das angegebene Muster optional ist? da es "Null" sagt, oder muss es die optionale Vorkommenotation verwenden? – iahsp4

+0

Ja, "Null oder mehr" erlaubt Null, daher ist das Muster optional. Im Allgemeinen ist (x) * 'dasselbe wie ((x) *)?' Für jeden regulären Ausdruck 'x'. –

+0

Danke nochmal .. :) – iahsp4

Verwandte Themen