Regex anpassen

Diskutiere Regex anpassen im Java Basics - Anfänger-Themen Bereich.
M

Mika34

Hi nochmal,

Ich bin gerade dabei einen Regex zu erstellen und habe gemerkt, dass es nicht so wirklich klappt. Irgendwie verstehe ich den Aufbau noch nicht so ganz.
Code:
(^delete track$)
Dieser Regex nimmt nur einen String an, welcher "delete track" ist. Möchte ich nun, dass nach dem "track" ein Leerzeichen kommt und dann positive Integer-Werte kommt, wie stelle ich das dann an?
Ich habe an:
Code:
(^delete track$)(\s)([0-9]+)
gedacht, jedoch funktioniert dies nicht. Könnte mir einer erklären, wie man gezielt solche Regex baut, bei denen ein Teil fest definiert ist und der Rest in Maßen frei wählbar ist.

Darüber wäre ich tierisch dankbar!
 
M

Mika34

Aber ansonsten stimmt der Aufbau, weil beim Aufbau eines Regex tue ich mich noch sehr schwer.
 
M

Mika34

Denn in Eclipse passt er mir den Regex automatisch so an:
Code:
(^delete track)(\\s)([0-9]+)$ //mit \\ statt \ bei dem s
und dann entspricht dies nicht mehr dem Regex, zumindest im Regex Tester
 
mihe7

mihe7

:) In Java hat der Backslash in Strings die Funktion, nachfolgenden Zeichen eine andere Bedeutung zu geben. So ist es möglich in einem String z. B. Return-Zeichen einzufügen "\r", einen Tabulator ("\t") oder ein beliebiges Unicode-Zeichen "\u0123".

Deswegen muss der Backslash nochmal wiederholt werden, um im String einen Backslash zu erhalten.

Kurz: beide haben Recht aber in Java musst Du die Form mit \\ nehmen.
 
M

Mika34

Dann ergibt das Sinn wieso im Tester dort Java-Script ausgewählt ist, ist es dort dann mit einem Backslash?
Ich nehme es mal an, oder?
 
M

Mika34

Ich komme gerade echt an meine Grenzen. Wie soll man solch einen Regex angeben: Lowercase Letter, Modifier Letter, Other Letter, Titlecase Letter, Uppercase Letter und die Ziffern 0-9 aus dem Unicode.
Konkateniert man die Regex dann miteinander oder macht man hier Fallunterscheidungen?
 
mihe7

mihe7

Dann ergibt das Sinn wieso im Tester dort Java-Script ausgewählt ist, ist es dort dann mit einem Backslash?
JavaScript kennt reguläre Ausdrücke als Literal, d. h. als Teil der Sprache. Notiert wird dieses mit zwei Schrägstrichen, ggf. unmittelbar von Flags gefolgt: /<regex>/<flags>. Dabei wird regex nicht-escaped angegeben.

/\s/.test(' ') liefert z. B. true.

Es gibt aber auch in JavaScript die Möglichkeit, ein RegExp-Objekt zu erzeugen, das im Konstruktor einen regulären Ausdruck als String entgegennimmt. In einem String-Literal müsste man escapen: new RegExp("\\s").test(' ')

EDIT: zu früh abgeschickt...
Wie soll man solch einen Regex angeben: Lowercase Letter, Modifier Letter, Other Letter, Titlecase Letter, Uppercase Letter und die Ziffern 0-9 aus dem Unicode.
Beispiel: [\p{Lu}\p{Ll}] dürfte alle Unicode-Zeichen aus den Kategorien Uppercase und Lowercase Letter matchen.
 
M

Mika34

Das erklärt so einiges, aber da frage ich mich: DAs sieht sehr ähnlich aus zu der Vereinigung von Wörtern und formalen Sprachen.
Wenn ich nun [\p{Lu}\p{Ll}] U W[\p{Lu}\p{Ll}] haben möchte, also dass das W immer nur in konkateniert mit [\p{Lu}\p{Ll}] vorkommen kann. Also wenn das nur das W da steht, soll es nicht erkannt werden, aber wenn bspw. W321321fdfd oder WW oder WE da steht, dann soll es erkannt werden.
Gibt es bei den Regex auch eine ähnliche Operation wie die Vereinigung von Mengen U oder muss man hier dann über eine Fallunterscheidung gehen?
 
mihe7

mihe7

In eckige Klammern kommen Zeichenklassen und ja, das ist die Vereinigung von Zeichenklassen.

also dass das W immer nur in konkateniert mit [\p{Lu}\p{Ll}] vorkommen kann
Dann schreibst Du einfach "W[\\p{Lu}\\p{Ll}]" - wobei das nur zwei Buchstaben umfasst. Das erste Zeichen ein W, das zweite eben aus der vereinigten Zeichenklasse. Sollen mehrere Zeichen aus der Zeichenklasse folgen, schreibst Du am Ende noch ein "+".
 
M

Mika34

Code:
"(^create engine)(\\s)[\\p{Lu}\\p{Ll}]+(\\s)[\\p{Lu}\\p{Ll}]+(\\s)([0-9]+)(\\s)(true|false)(\\s)(true|false)$";
Ich habe nun diesen Regex jedoch schlägt er im Tester gut aus, jedoch in Java reagiert er darauf gar nicht, hat jemand eine Idee?
 
M

Mika34

Oh, aber mit
Code:
^(create engine)(\\s)[\\p{Lu}\\p{Ll}]+(\\s)[\\p{Lu}\\p{Ll}]+(\\s)([0-9]+)(\\s)(true|false)(\\s)(true|false)$
geht es immer noch nicht, obwohl es im Tester geht. Irgendwo ist doch hier der Haken
 
M

Mika34

Mit ein weniger Spielerei hat es nun geklappt. Ist es nun auch möglich bei dem UTF-8 String Zahlen auch zu erlauben also eine Vereinigung von UTF-8 und ganzzahligen Zahlen
 
M

Mika34

Ich verstehe es nicht. Ich meinte, dass das [\\p{Lu}\\p{Ll}]+ U mit ganzzahligen Zahlen möglich ist oder verstehe ich nicht was du meinst
 
Thema: 

Regex anpassen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben