Announcement

Collapse
No announcement yet.

Wörter aus Großbuchstaben mittels RegEx

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

  • Wörter aus Großbuchstaben mittels RegEx

    Hallo,

    ob ich hier richtig bin?

    In einer Java-Anwendung versuche ich, aus einem Text (String) alle Wörter, die nur aus Großbuchstaben (auch deutsche Umlaute, ggf. noch Satzzeichen und Zahlen) bestehen, zu extrahieren. In Klammern gesetzte Wörter sollen dabei ignoriert werden. Als Lösungsansatz verwende ich reguläre Ausdrücke und die Klassen Pattern und Matcher. Trotz mehrtägiger Internet-Recherche finde ich bislang keine befriedigende Lösung.
    Vielleicht kann ja hier jemand helfen...

    Beispiel-Strings:
    Code:
    Hier kommt MAX gerannt.
    STEFFEN und BÄRBEL sind noch immer im Zimmer.
    DR. MARTIN (ERREGT) betritt den Raum.
    PAUL
    Als Ergebnisse erwarte ich:
    Code:
    MAX
    STEFFEN, BÄRBEL
    DR. MARTIN
    PAUL
    Vielen Dank schon mal im Voraus!

    Gruß Knut

  • #2
    http://www.fileformat.info/tool/regex.htm

    \s*([A-ZÜÖÄ]+[\.,\d]*)[\s$]
    Zuletzt editiert von Christian Marquardt; 24.04.2010, 07:13.
    Christian

    Comment


    • #3
      Moin Christian,

      der frühe Vogel usw...

      Originally posted by Christian Marquardt View Post
      Wie bedient man das??

      Originally posted by Christian Marquardt View Post
      \s*([A-ZÜÖÄ]+[\.,\d]*)[\s$]
      ... und das war's leider noch nicht, denn es findet NICHT 'DR. MARTIN' sondern in dem Fall nur 'DR.', was mir nix nützt.

      Mein letzter Versuch war (weitere europäische Umlaute müssen evtl. noch ergänzt werden)
      Code:
      ((\b[A-ZÄÖÜßÁÀÂÉÈÊ0-9 \-\.,/']+\b)+)+?(?:.*)?
      und das findet z.B. DR. HANS-WÄRNER ULLRICH in den Sätzen:
      Code:
      DR. HANS-WÄRNER ULLRICH ist traurig.
      DR. HANS-WÄRNER ULLRICH (IM KITTEL) ist traurig.
      aber nicht in
      Code:
      Oberarzt DR. HANS-WÄRNER ULLRICH ist traurig.
      Das ist schon ziemlich nahe dran, finde ich.

      Um diesen Ausdruck auf beliebigen Text (zeilenweise) anwenden zu können, wäre es also erforderlich, Zeilen solange von vorn zu verkürzen, bis das erste Zeichen ein Großbuchstabe ist - damit könnte man notfalls leben... Allerdings suche ich noch die ganz elegante Lösung ohne das Verkürzen (Prozesszeit bei langen Texten!) - das muss doch auch möglich sein...

      Also, wenn jemand noch den ultimativen Tip hat oder Du, lieber Christian, mit diesen Informationen noch weiterdenken magst... weitere Vorschläge willkommen!

      Gruß vom Knut

      Comment


      • #4
        nur 'DR.', was mir nix nützt.
        Nein, tut er nicht, er findet alle aus dem Text.

        Bild1.jpg

        Er findet DR. und MARTIN

        Wenn du das zusammen willst (das geht aus deinem Post nicht hervor), musst du ein lookahead benutzen

        Wie bedient man das??
        Das ist nicht ersichtlich???

        In "Regular Expression" kommt der reguläre Ausdruck rein

        In "Test String #" bis zu 10 Teststrings

        In "Replacement" kommt was rein, wenn man was ersetzen will

        Und dann drückt man auf "Test"

        as a Java string gibt dir den Ausdruck so zurück, wie er in den Pattern genutzt werden kann (escaped)
        Zuletzt editiert von Christian Marquardt; 24.04.2010, 10:20.
        Christian

        Comment


        • #5
          Gelöst

          Hallo Christian,

          vielen Dank für die zwei "Anschübe", die zur Lösung führten:
          1. tolles Tool zu Testen (und jetzt hab' ich's auch kapiert!)
          2. die Tatsache, dass man die Suche mehrmals anwenden kann/muss, war mir nicht klar (Wald, Bäume)...


          Hier mal mein Codefragment (Pattern nochmals verändert):
          Code:
          String testPattern = "((\\b[A-ZÄÖÜßÁÀÂÉÈÊ0-9\\.]+[ /:'\\-!\\?\\*\\+]?\\b)+)+?";
          Pattern p = Pattern.compile(testPattern);
          String testStr = "Oberarzt DR. HANS-WÄRNER ULLRICH ist traurig. Er schaut auf MARIE, die im Bett liegt.";
          Matcher m = p.matcher(testStr);
          int v = 0;
          while (m.find()) {
          	v++;
          	System.out.println(v + ". Versuch: >" + m.group() + "<");
          	testStr = testStr.replaceFirst(m.group(), "");
          	m.reset(testStr);
          }
          Das liefert dann
          Code:
          1. Versuch: >DR. HANS-WÄRNER ULLRICH <
          2. Versuch: >. <
          3. Versuch: >. <
          4. Versuch: >. <
          5. Versuch: >MARIE<
          Gut: ich muss also noch prüfen, dass wenigstens ein Buchstabe im Ergebnis vorkommt (verschiedene andere Versuche scheiterten, indem 'DR' und 'HANS-WÄRNER ULLRICH' einzeln aufgeführt wurden).

          Noch eine letzte Frage: ist das prinzipielle Herangehen so O.K. oder "macht man das so nicht" bzw. geht's noch eleganter?

          Also nochmals herzlichen Dank, vor allem auch für die schnellen Antworten!

          Gruß vom Knut

          Comment

          Working...
          X