Announcement

Collapse
No announcement yet.

Textzerlegung mittels regulärer Ausdrücke

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Textzerlegung mittels regulärer Ausdrücke

    Hallo,

    ich habe einige Probleme bei der Formulierung regulärer Ausdrücke. Ich möchte einen beliebigen Text in seine Bestandteile zerlegen, d. h. Wörter sowie Interpunktionszeichen sollen am Ende jeweils als eigenes Element vorliegen.
    Dazu habe ich zunächst folgendes Beispielprogramm erstellt:
    Code:
    import java.util.*;
    import java.util.regex.*;
    
    public class Test {
    
      public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        String text = "Er sagte: \"Bis bald!\" - und verschwand.";
        String regex = "(\\p{Punct}*)(\\p{Alnum}+)(\\p{Punct}*)\\p{Space}";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(text);
        while (m.find()) {
          for (int i = 1; i <= m.groupCount(); i++) {
            if (!m.group(i).equals("")) al.add(m.group(i));
          }
        }
        System.out.println(al);
      }
    }
    Nun habe ich das Problem, dass Ausrufezeichen und Redezeichen ein zusammenhängendes Element bilden, obwohl ich sie separat haben möchte und der Gedankenstrich sowie das letzte Wort des Texts werden gar nicht erfasst.
    Das liegt natürlich an meinem regulären Ausdruck, allerdings weiß ich nicht, wie ich den geeignet umformulieren muss, um das gewünschte Ergebnis zu erhalten.

    Ich hoffe mir kann jemand weiterhelfen.

    Vielen Dank schonmal und viele Grüße

  • #2
    Ich kann Dir zwar mit der regular expression nicht weiterhelfen, auch weil ich Deine Anforderung nicht genau verstanden habe.

    Aber ich empfehle ein Plugin zu verwenden, um ohne Code mehrere Expressions testen zu können.

    Für Eclipse verwende ich immer dieses Eclipse plugin/

    Comment


    • #3
      Greedy Regex

      Hallo altralaser,

      Nun habe ich das Problem, dass Ausrufezeichen und Redezeichen ein zusammenhängendes Element bilden, obwohl ich sie separat haben möchte
      Das Problem entsteht, weil Regular Expressions defaultmäßig "greedy" sind. D.h. sie versuchen, immer möglichst viel in den Match hinein zu bekommen. Wenn Du z.B. den String" !! " hast, dann wird auch "!!" gematcht. Das bekommst Du gelöst, indem Du entweder den Quantifizierer auf genau 1 stellst, oder in dem Du die Expression relunctant machst. Dafür musst Du ein "?" hinter den Quantifizierer setzen.

      und der Gedankenstrich
      Das liegt -glaube ich- am Zeichensatz. Die POSIX Character-Classes funktionieren nur bei US-ASCII.

      sowie das letzte Wort des Texts werden gar nicht erfasst.
      Das liegt an dem "\\p{Space}" in Deinem Ausdruck. Das letzte Wort wird nicht von einem Space gefolgt. Deswegen matcht es nicht.

      Gruß ngomo
      http://www.winfonet.eu

      Comment


      • #4
        Mal so als Hinweis:

        Zum testen (erzeugt auch gleich den Javacode):

        http://www.fileformat.info/tool/regex.htm

        Siehe
        Greedy quantifiers
        Reluctant quantifiers
        Possessive quantifiers
        Christian

        Comment


        • #5
          Hallo,

          also, die Erklärung warum das letzte Wort nicht gematcht wird, klingt logisch. Ich habe an den Beispieltext jetzt einfach noch ein Leerzeichen angehängt, das funktioniert.
          Was das Fragezeichen als Quantifier betrifft: Das wird mir glaub ich nichts bringen, denn dann werden das Ausrufe- und das Redezeichen gar nicht mehr gematcht, da sie ja mehr als ein Zeichen lang sind. Ich dachte eher an eine Möglichkeit, beide Zeichen getrennt gruppieren zu lassen. Notfalls könnte ich das auch programmseitig (also in Java) noch "nachbearbeiten", allerdings ist das nicht sehr praktikabel.
          zum Matching des Gedankenstriches: Hm, also eigentlich ist dieser ja ein ASCII-Zeichen mit Codeposition < 127.
          Aber wahrscheinlich zählt er nicht zur Zeichenklasse [:alnum:], das wäre natürlich möglich. Ich habe dafür also jetzt eine Auswahlmenge definiert und meinen RegExp folgendermaßen geändert:
          Code:
          String regex = "(\\p{Punct}*)([\\p{Alnum}-]+)(\\p{Punct}*)\\p{Space}";
          Was mich jetzt noch verwundert ist, dass wenn ein Wort Umlaute enthält, sie nicht korrekt gematcht werden. Zumindest diese sollten doch zu [:alnum:] gehöen oder? Muss ich die Umlaute, ß und Buchstaben mit Accent jetzt alle einzeln in die Auswahlmenge schreiben? Den Punktoperator .+ kann ich ja schlecht nutzen, da dieser auch die Leerzeichen mit einbezieht.

          Vielen Dank und viele Grüße

          Comment


          • #6
            Mal ein anderer Ansatz mittels FIND

            Bild1.jpg
            Christian

            Comment

            Working...
            X