Java RegEx tut nicht, was er soll - Disjunktion klappt nicht

John Reese

Lt. Commander
🎅Rätsel-Elite ’25
Registriert
März 2008
Beiträge
1.371
Hallo Leute,

ich würde jetzt nicht behaupten, RegEx-Experte zu sein, verzweifle gerade aber richtig an folgendem Problem:

Code:
public class Main {
    public static void main(final String[] args) {
        final Pattern pattern = Pattern.compile("-NP(?<NP>\\w+)- (?:and)|(?:or) other -NP(?<NP0>\\w+)-");
        final String haystack = "But nice also to -NPpardalotes- and other -NPbirds-.";

        final Matcher matcher = pattern.matcher(haystack);

        if (matcher.find()) {
            for (int i = 0; i < matcher.groupCount(); i++) {
                System.out.format("Group %d: %s%n", i, matcher.group(i + 1));
            }
        } else {
            System.out.format("No match");
        }
    }
}

Ich würde ja jetzt erwarten, dass ich statt
Group 0: pardalotes
Group 1: null

als Ausgabe:
Group 0: pardalotes
Group 1: birds
erhalte. Aber nein, Pustekuchen.

Und ja, es geht um eine Hausaufgabe, in welcher ich Hearst Patterns erkennen muss. Allerdings hat dieses Problem nur ganz indirekt damit zu tun.

Ach ja: Bevor sich jemand fragt, wieso ich behaupte, die Disjunktion ("|") klappt nicht: Laut einem online Java (!) RegEx-Tester (habe den nicht mehr offen) matcht das Pattern ab der Disjunktion nicht mehr, sobald sie da ist.
 
Zuletzt bearbeitet:
Code:
(?<=(-NP)).*(?=(-))

hilft das? oder brauchst du es in den gruppen?
 
Zuletzt bearbeitet:
Ja, ich brauche den String / das Wort innerhalb "-NP" und "-".

EDIT:
Tatsächlich: Wenn man das "|" rausnimmt geht das mit den "birds" - WTF? Hilft mir nur nicht weiter.
 
Zuletzt bearbeitet:
Mach um das "and" und "or" noch eine non-capturing Klammer. Komplette Lösung kannst du dann ja posten, wenn du es fertig hast. Dein "|" bezieht sich auf die komplette RegEx und teilt diese in zwei Bereiche. Wenn die erste zutrifft, wird die zweite nicht geprüft.

1. Bereich
Code:
-NP(?<NP>\\w+)- (?:and)
2. Bereich
Code:
(?:or) other -NP(?<NP0>\\w+)-
 
Zuletzt bearbeitet:
Danke @Ocram1992:

Mein Pattern sieht jetzt so aus:

Code:
-NP(?<NP>[a-zA-Z_0-9 ]+)- (?:(?:and)|(?:or)) other -NP(?<NP0>[a-zA-Z_0-9 ]+)-

@r15ch13:
Danke, aber mir ist das "and" / "or" schon wichtig, also die Struktur muss schon genauestens eingehalten werden :)
 
Zurück
Oben