regex match Alternativen



  • Hallo,

    hiermit möchte ich fragen...
    wie kann ich folgenden Satz im Text finden und feststellen ob die Alternatüiven benutzt wurden oder nicht?

    z.B. Text text. Ich bin Tom. Text text text . Ich bin Jim. Ich bin Michael.

    pattern: "Ich bin Tom | Michael"

    Wie kann man die Information bekommen, dass "Ich bin w*" wurde 3 mal benutzt und "Ich bin Tom | Michael" 2 mal,d.h. Tom und Michael sind optionale Teile, die können aber müssen nicht unbedingt im Text vorkommen.
    Vielen Dank!

    Gruß,
    Jimmy


  • Administrator

    Nimm folgenden Regex: "Ich bin (\w)" .
    Es soll also nach "Ich bin " gesucht werden gefolgt von einem Wort. Die Klammern erzeugen eine Gruppe, welche man dann extrahieren kann. Siehe dazu:
    Regex.Matches
    Match.Groups

    Danach kannst du prüfen, wenn du über die Treffer iterierst, ob das Wort Michael, Tom oder etwas anderes war.

    Grüssli



  • Und die MatchCollection Klasse hat ein Count-Property, falls Du die Anzahl der Treffer suchst.



  • Danke!
    ja, genau.
    ich habe dann so gemacht:
    "ich bin (Tom)?(Jim)?"

    foreach (Match m in mCollect)
                        {
                            for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
                            {
                                if (m.Groups[gIdx].Value.Length > 0) sumOptParts++;
                            }
    }
    

    Damit bekomme ich die Anzahl von optionale Teile.

    Aber der Text, der ich bearbeiten soll, enthält leider ein paar Fehler.
    Meine optinale Teile stehen in "<>" ("<Tom>" ersetze durch "(Tom)?")
    und ab und zu fehlt "<" oder ">", sodass regex mit exception endet: "System.ArgumentException: parsing... Not enough )'s"

    Wie kann ich das beseitigen, z.B. wenn eine Klammer fehlt ">", ersetze "<" nicht durch "(" sondern durch "\(". In dem Fall finde ich keine Übereinstimmungen, aber zumindest keine Ausnahme 😉
    P.S. Klammer können auch verschachtelt sein: "(Tom(12)?(20(student)?(schüler))?"

    Gruß


  • Administrator

    Jimmmy81 schrieb:

    ich habe dann so gemacht:
    "ich bin (Tom)?(Jim)?"

    Das ist aber etwas völlig anderes! Damit wäre auch "Ich bin TomJim" ein positiver Treffer. Wieso hast du nicht den oben erwähnten Regex verwendet? Wieso hast du dich gegen diesen entschieden?

    Und zum Rest deines Beitrags: Hä? 😃
    Das sind für mich alles unvollständige und zusammenhangslose Sätze. Ich habe jedenfalls nicht begriffen, was du möchtest. Vielleicht solltest du etwas weiter ausholen, was du eigentlich tun möchtest.

    Grüssli



  • Dravere, du hast Recht. Aber ich möchte auch zulassen, dass alle optionale Teile vorkommen dürfen. Mit "(Tom)?" muss ich danach kein comparison mehr machen. Das wird alles impliziert gemacht.

    Im text stehen optionale Teile in "<>".
    ich ersetze z.B. "<Tom>" durch "(Tom)?" und bekomme mein pattern. Wenn im Text nur noch "<Tom" steht, kommt "(Tom" raus. Und damit auch ein exception 😞


Anmelden zum Antworten