REGEX Erklaerung

tanzverfuehrung

Bekanntes Mitglied
Also es gibt ja für Eclipse das plugin Eclipse Regular Expression (RegExp) Tester und damit habe ich mir nun mein Regulären Ausdruck zusammen gebaut, aber eine Sache ergibt für mich einfach kein Sinn!:oops:
Und dazu bräuchte ich male eine Erklärung

das ein beispiel code jetzt


Java:
dsdsad
}

@Test
public void shouldRemoveItem() {
 QueueX queue = new QueueX();
 queue.add(c);
 assertThat(queue.size(), eq(1))
 queue.remove(c);
 if (bla){

}
 assertThat(queue.size(), eq(0))
}


/*asdsad


und genau , der abschnitt soll gefunden werden



@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}
assertThat(queue.size(), eq(0))
}


also eine testmethode, mit und ohne kommentar oben drueber..
und das ganze funktioniert mit dem regex:


(\/\*((\r\n).*)*\*\/)*(\r\n)*\@Test.*((\r\n).*)*.*shouldRemoveItem.*((\r\n).*)*\}



so was ich jetzt aber nicht verstehe, wieso es nicht bei der ersten } klammer zu ende ist!!! weil eigentlich der Ausdruck *shouldRemoveItem.*((\r\n).*)*\} , sagt ja eigentlich nur...das nach der methode beliebig viele zeichen kommen und beliebig viele zeilenumspruenge bis diese } Klammer kommt!

Kann mir das jemand bitte erklaeren!:rtfm::bahnhof:
 
B

bygones

Gast
ist es nicht einfacher diesmal ohne regex das zu machen ? der regex kann nur gross, unverstaendlich und unwartbar werden meiner Ansicht nach.

Parser schreiben der eine Methode inklusive Kommentare erkennt und dann den entsprechenden Eintrag loeschen oder was auch immer - der parser kann dann nach dem einfachen substring/indexOf oder was auch immer arbeiten
 

tanzverfuehrung

Bekanntes Mitglied
Hm, ich sehe in dem gesamten Ausdruck nur eine schließende geschweifte Klammer ganz am Ende. Was meinst du denn genau mit "der ersten"? ???:L


ich meinte in meinem java code gibt es zwei klammern
Java:
@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}
assertThat(queue.size(), eq(0))
}

und nach dem regex wuerde ich sagen, das eigentlich nur bis hier geht:

@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}


er geht aber bis zur letzten klammer , also

@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}
assertThat(queue.size(), eq(0))
}


und da brauchte ich jetzt eine erklaerung zu!?!?!????:L

weil da verstehe ich nicht.wieso?weshalb?warum?:rtfm:

also es ist ja richtig aber ich will es ja auch verstehen!danke
 

tanzverfuehrung

Bekanntes Mitglied
ist es nicht einfacher diesmal ohne regex das zu machen ? der regex kann nur gross, unverstaendlich und unwartbar werden meiner Ansicht nach.

Parser schreiben der eine Methode inklusive Kommentare erkennt und dann den entsprechenden Eintrag loeschen oder was auch immer - der parser kann dann nach dem einfachen substring/indexOf oder was auch immer arbeiten

ja ich wollte es ja auch eigentlich ohne regex machen und finde es auch übersichtlicher , ABER mein Ausbilder hier im Ausland, hat sich das angeguckt und meinte er will das mit REGEx haben:bahnhof:;(
kann ich nichts machen. ich führe nur aus...
 

Michael...

Top Contributor
und da brauchte ich jetzt eine erklaerung zu!?!?!????:L

weil da verstehe ich nicht.wieso?weshalb?warum?:rtfm:

also es ist ja richtig aber ich will es ja auch verstehen!danke
Erklärung: Das ist RegEx ;-) In dem RegEx ist ja nicht festgelegt, dass er nach der ersten Klammer aufhören soll. Quantoren sind standardmäßig gierig, heißt sie nehmen möglichst viel mit was ins "Muster" passt. Mittels ? nach einem Quantor kann man dieses Verhalten abstellen.
 

tanzverfuehrung

Bekanntes Mitglied
Muss der RegEx denn so aussehen? Oder konkret was soll der RegEx den finden? Warum diese vielen Linefeeds im Ausdruck?

also erst mal danke für deine Erklärung.

Naja der regEx soll eine bestimmte Testmethode finden...da ich aber nicht weiß wie viele Zeilen die Methode hat, brauche ich so viele Linefeed's, denke ich!Und davor brauche ich Linefeed's, weil es könnte ja sein, das ein Methodenkommentar dabei ist
Java:
/*
*kommentar
*/
es muss aber kein Kommentar vorhanden sein
und zwischen dem Kommentar und der @Test annotation kann ja auch eine oder mehrere Leerzeile sein, muss aber nicht!!!

hoffe war verständlich!
aber durch deine Erklärung, ist klar geworden,das der regex noch nicht ganz richtig ist!
 

Mujahiddin

Top Contributor
Wie nutzt Du den RegEx? Mit Pattern und Matcher? Mit dem Flag Pattern.DOTALL gilt ein . im RegEx auch für einen Zeilenumbruch.

oder einfach ein (?s) vor den gesamten Ausdruck setzen.
Übrigens, ich hab mal deinen Regex getrimmt! Du hast einige Sachen escapet, die man nicht escapen braucht.

Code:
(?s)(/\*.*\*/)*.*@Test.*shouldRemoveItem.*\}

Paar Anmerkungen:
- Der Kommentar wird gecaptured. Um das zu verhindern:
Code:
(?s)(?:/\*.*\*/)*.*@Test.*shouldRemoveItem.*\}

- Falls am Ende der Methode noch irgendwas steht und bei diesem Irgendwas ein "}" auftaucht, wird alles bis zu diesem } gematcht.
 

tanzverfuehrung

Bekanntes Mitglied
Java:
dsdsad
}
 /*
*kommentar
*/

@Test
public void shouldRemoveItem() {
 QueueX queue = new QueueX();
 queue.add(c);
 assertThat(queue.size(), eq(1))
 queue.remove(c);
 if (bla){
 
}
 assertThat(queue.size(), eq(0))
}
 
/*asdsad





also das ding ist, das ich die ganze Testmethode finden will, also bis zur letzten Klammer { , die meine methode schließt...mit @Test Annotaion und mit Kommentar, ALSO GENAU DAS


/*
*kommentar
*/
@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}
assertThat(queue.size(), eq(0))
}


das funktioniert auch schon mit meinem regex, das einzige Problem ist, wenn ich im Code noch eine Klammer ganz unten hinzufüge, ist das die letzte
also
WENN der Code ist
Java:
dsdsad
}
 /*
*kommentar
*/

@Test
public void shouldRemoveItem() {
 QueueX queue = new QueueX();
 queue.add(c);
 assertThat(queue.size(), eq(1))
 queue.remove(c);
 if (bla){
 
}
 assertThat(queue.size(), eq(0))
}
 
/*asdsad
}

(siehe letzte Zeile)

DANN kriege ich den ganzen block:

/*
*kommentar
*/

@Test
public void shouldRemoveItem() {
QueueX queue = new QueueX();
queue.add(c);
assertThat(queue.size(), eq(1))
queue.remove(c);
if (bla){

}
assertThat(queue.size(), eq(0))
}

/*asdsad
}




also das Problem liegt nicht in den Kommentaren...das funktioniert schon alles!
und die stack Overflow seite zeigt nur wie ich eine Methoden Deklaration finde, also nur die erste Zeile, ich brauch aber die ganze Methode, mit INHALT und bis ZUR LETZTEN KLAMMER!!!!
 

tanzverfuehrung

Bekanntes Mitglied
erst mal DANKE!:toll:

Paar Anmerkungen:
- Der Kommentar wird gecaptured. Um das zu verhindern:
Code:
(?s)(?:/\*.*\*/)*.*@Test.*shouldRemoveItem.*\}

Sorry aber was genau heißt gecaptured???
bzw. was genau macht jetzt ?: ??




- Falls am Ende der Methode noch irgendwas steht und bei diesem Irgendwas ein "}" auftaucht, wird alles bis zu diesem } gemacht.
genau das ist eigentlich auch , nach der Erklärung, mein Problem gewesen.:bahnhof:

EDIT:
zu (?s) ...also

wenn ich mir die Erklärung für s angucke, heißt es ja das die Steuerzeichen da drin vorhanden sind zozusagen und deswegen passt das auch für zeilenumbrueche???

und für das Fragezeichen ?, heißt es ja eigentlich, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor. (Dies entspricht {0,1})

aber es feedlines kommen ja öfter vor, also musste das dann nicht eigentlich * sein???
also es funktioniert mit ? aber verstehe schon wieder nicht wieso das funktioniert?!?!


ok habe es grad ausprobiert, es funktioniert sogar nur mit dem fragezeichen aber wieso?????:L

EDIT:
und dein regex....nimmt auch alles mit was vor dem kommentar steht....das darf nicht passieren!
:eek:
 
Zuletzt bearbeitet:

Mujahiddin

Top Contributor
Hallo
Zum
Code:
(?s)
:
Normalerweise matcht ein Punkt "." jedem Charakter außer Zeilenumbrüchen.
Wenn du vor dein Regex ein (?s) setzt, setzt du diesen "Flag", also du sagst deinem Matcher, dass er bei "." ALLES inklusive Zeilenumbrüche nehmen soll!
Es gibt noch andere Flags, z.B. i für case-insensitive. Auf Groß/Kleinschreibung wird dann keinen Wert gelegt. Und dann noch "m" und "d" (Google!)

Ja, alles vor dem Kommentaren wird auch genommen, dazu würde ich für diese eine Stelle den Flag "s" ausschalten:

Code:
(?s)(/\*.*\*/)(?s:.)*@Test.*shouldRemoveItem *\{.*\}

Und eine Lösung dafür, dass nur die Methode genommen wird, ist ein wenig verzwickt.
Bei verschachtelten { } kommt man da schnell ins Grübeln...
Mir fällt gerade auch nicht wirklich ein, wie man das macht.
 

Mujahiddin

Top Contributor
Bei näheren Überlegen denke ich, dass das mit Regex gar nicht funktioniert.
Bei einfach verschachtelten { } ist es einfach mit folgendem Regex:

Code:
(?s)(/\*.*\*/)(?s:.)*@Test.*shouldRemoveItem *\{(.*\{.*?\})*.*?\}

Aber bei doppelt verschachtelten oder n-fach verschachtelten { } ist das schwer (bishin zu unmöglich) mit Regex.
Du kommst wahrscheinlich nicht drumrum, einen Parser zu schreiben.
Du könntest allerdings einen kleinen eigenen Parser schreiben, der einen Counter (zu Beginn 0) hat, in die Methode "reingeht" und bei allen öffnenden Klammern den Counter +1 setzt und bei allen schließenden -1. Sobald der Counter auf -1 fällt, bricht er ab.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F RegEx bei Hexstring Allgemeine Java-Themen 8
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben