RegExp bzw Pattern in Java

  • Themenstarter Themenstarter Lunatikz
  • Beginndatum Beginndatum
L

Lunatikz

Gast
Hi,

Ich möchte gern einen regulären Ausdruck für ein Pattern in Java definieren. Und zwar will ich folgendes zulassen:
- F1[0] (bzw. [1],[0..1])
- F[0] (bzw. [1],[0..1])
- !F[0] (bzw. [1],[0..1])
- F1.G1[0] (bzw. [1],[0..1])
- !F1.G1[0] (bzw. [1],[0..1])
- TRUE
- FALSE

Die Buchstaben (in diesem Bsp. F oder G) sind beliebig (auch in der Anzahl) und case sensitive. Der folgende Pattern ist auch noch nicht fertig für die eckigen Klammern.

Ich hab folgendes Pattern bisher definiert:
Java:
Pattern p = Pattern.compile("[\\!]?[a-zA-Z]*[0-9]?[\\.]?|[TRUE]|[FALSE]");

Mein grundsätzliches Problem besteht darin, dass ich nicht genau weiss, wie man regExp verodern kann, ich habs mit dem logischen Operator | probiert, was auch keinen Compilerfehler erzeugt. aber es werden auch andere Worte akzeptiert, die nicht TRUE und FALSE sind, vermutlich durch [a-zA-Z]*, oder ?
Meine Frage lautet nun, wie ich es erreiche dass obige Bsp alle akzeptiert werden, als auch TRUE und FALSE aber eben andere Worte nicht ?

Ein Dank im Voraus, für jedewede Hilfe.

Grüße,
 
[TRUE] akzeptiert genau einen Buchstaben der entweder T, R, U oder E ist, lasse dort die eckigen Klammern weg,

verwende allerdings schon ruhig Klammern, so wie man auch sonstige UND/ ODER Ausdrücke klammert:
(..)|(..)|(..)
sonst kannst du dir (außer bei guter Regelkenntnis) nicht sicher sein, ob sich das | vielleicht nur auf einen Teil bezieht,
ist ABC|DEF vielleicht AB, dann C oder D, und dann EF oder doch die Alternative zwischen ABC und DEF?
 
Ich möchte gern einen regulären Ausdruck für ein Pattern in Java definieren. Und zwar will ich folgendes zulassen:
- F1[0] (bzw. [1],[0..1])
- F[0] (bzw. [1],[0..1])
- !F[0] (bzw. [1],[0..1])
- F1.G1[0] (bzw. [1],[0..1])
- !F1.G1[0] (bzw. [1],[0..1])
- TRUE
- FALSE

Was soll das heissen? Mach ein paar Beispiele, welche gematcht werden sollen, und solche, welche nicht gematcht werden sollen. Natürlich kann [c]TRUE[/c] nicht mit [c][TRUE][/c] gematcht werden, sondern mit [c]TRUE[/c]. Denn die Klammern stehen für eine Auswahl (du sagst also 1 Zeichen, entweder T, R, U oder E).
 
@slaterB:
Danke für den Hinweis, hab die eckigen Klammern um TRUE bzw FALSE entfernt.
Bin leider nicht so gut, was reguläre Ausdrücke betrifft, hab damals in der Uni nicht wirklich in der VL aufgepasst :/

@faetzminator:
Danke für deine Antwort.
Ehm, das sind die Beispiele die zugelassen werden sollen..
Alles andere was nicht so ausschaut, soll eben false zurückgeben.

Bsp für Sachen die nicht zugelassen werden sollen:
TUER, TREU, FASLE, blub, bla .. also jedes andere Wort was den Konventionen nicht entspricht.
Es handelt sich bei den Wörtern um Literale einer erweiterten Aussagenlogik bzw. eingeschränkter Prädikatenlogik ohne Quantoren etc. (also freie Formeln)


@beide: Leider werden noch immer alle Worte akzeptiert, mir fällt allerdings keine andere Lösung ein, um beliebige o.g.Literale der Form (zB. F[0] etc,) zuzulassen als [a-zA-Z]*[0-9]? , da die Anzahl der Buchstaben für Literalnamen beliebig sein sollen.
 
Genauigkeit Genauigkeit, warum bleibst du nicht dabei?
hat doch am Anfang mit einigen Beispielen gut angefangen..

wie passt
> da die Anzahl der Buchstaben für Literalnamen beliebig sein sollen.
zu
> Leider werden noch immer alle Worte akzeptiert
?
welches Beispiel-Wort soll denn nicht akzeptiert werden und warum?
sollen bei den beliebigen Literalen eckige Klammen vorkommen? das fehlt in deinem Pattern komplett,
den Zahlanzeil [0-9] hast du per ? optional gemacht, sollte das ? nicht weg damit die Zahl immer da ist?
 
Hi,

sollen bei den beliebigen Literalen eckige Klammen vorkommen? das fehlt in deinem Pattern komplett,

Ja das hatte ich schon in meinem ersten Post geschrieben, das hab ich noch nicht betrachtet den Fall.
Ok, ich denk ich hab da so langsam einen Denkfehler drin bzgl.
wie passt
> da die Anzahl der Buchstaben für Literalnamen beliebig sein sollen.
zu
> Leider werden noch immer alle Worte akzeptiert
?
Allerdings hab ich da ein wenig Freiheit, ich kann die Literalnamen auch auf einen Buchstaben begrenzen, und die Zahlen beliebig lang machen und glaub ich komm dann auch auf die Lösung. Die Zahl wäre optinal, also entweder keins oder eins.
Nach meiner neuen Definition, wäre dann natürlich die Länge der Zahl beliebig und die Buchstabenanzahl der Literale genau 1.
Ich denk ich werd das jetzt hinbekommen.
Tut mir leid, falls ich irgendwie Verwirrung gestiftet haben sollte 🙁.

Danke aber nochmal vielmals für eure Hilfe 🙂
Grüße,
Lunatikz
 
@faetzminator:
Danke für deine Antwort.
Ehm, das sind die Beispiele die zugelassen werden sollen..
Alles andere was nicht so ausschaut, soll eben false zurückgeben.

Ich versteh schlichtweg nicht, wass du mit diesen paar Zeilen aussagen willst. Soll das erste ein Pattern sein? Und in der Klammer ein Beispiel? Was hat es mit all den [] auf sich? Gib doch einfach Beispiele ohne irgendwelche Regex'(-ähnliche Dinge).
 

Zurück
Oben