# Regex mit Negation



## Alan47 (7. Okt 2011)

Hallo zusammen,

ich bin im Moment auf der Suche nach einem regulären Ausdruck, der alle Javadoc-Kommentare finden soll. Aktuell habe ich folgenden String (bitte beachten: es ist bereits ein Java-String, Backslashes sind also doppelt!)


```
String javadocRegex = "/\\*(\\*)?([\\w|\\W|\\s|\\S])*\\*/";
```

Nun, das Problem ist folgendes: der Ausdruck "[\\w|\\W|\\s|\\S]" passt auf zu vieles, nämlich auch die beendende Sequenz "\\*/". Wenn ich also folgenden String mit der Regex überprüfe:


```
/** ein Javadoc-Kommentar
*/
public void methodA(){
}
         
/** ein anderer Javadoc-Kommentar
*/
public void methodB(){
}
```


... dann findet Java hier den größtmöglichen Bereich zwischen "/**" und "*/", und das wäre alles bis auf die Methode "methodB()". Es sollen aber zwei separate Treffer (einen für jeden Javadoc-Kommentar) gefunden werden.

Ich bräuchte also anstelle des von mir verwendeten "[\\w|\\W|\\s|\\S]" einen Ausdruck für "alles außer die Sequenz */". 
Ich weiß wie man das mit Mengen anstellt (z.B. [^a-z]), aber für Sequenzen fällt mir hier leider keine Lösung ein....

Kann mir jemand weiterhelfen?


Gruß,


Alan


EDIT: Ich habe eine Lösung gefunden. Die arbeitet zwar nicht mit Negation, erfüllt den Zweck aber dennoch:

Indem man hinter "([\\w|\\W|\\s|\\S])*" ein "?" schreibt, findet der *-Quantifier nicht mehr den größt- sondern den kleinstmöglichen Treffer. Muss man auch wissen - man lernt nie aus


----------



## RySa (10. Okt 2011)

Nur mal als Info. Das "?" heißt nicht "finde den kleinst-möglichen Treffer" sondern, dass der Ausdruck nur einmal oder keinmal vorkommen darf, also nicht mehrmals. Das mag jetzt funktionieren, du solltest es aber vlt. noch gründlich Überprüfen bevor du es irgendwo produktiv einsetzt.

Gruß

Ps. Falls du doch feststellen solltest, dass es nicht so gut funktioniert, versuche vielleicht *? zu benutzen, also beide zusammen hintereinander


----------



## Alan47 (11. Okt 2011)

RySa hat gesagt.:


> Ps. Falls du doch feststellen solltest, dass es nicht so gut funktioniert, versuche vielleicht *? zu benutzen, also beide zusammen hintereinander




Genau das habe ich in meinem Edit vom ersten Post dann auch gemacht und es hat wunderbar funktioniert. Eventuell habe ich mich nicht klar genug ausgedrückt, aber im Endeffekt habe ich den * einfach durch *? ersetzt.

Gruß,


Alan


----------

