Erstes Vorkommen eines Musters in Strings - wie?

  • Hallo,

    in einem (einzeiligen) beliebigen String möchte ich immer nur das erste Vorkommen eines Musters (einen Doppelpunkt) erhalten und weiterverarbeiten, es kommt mindestens 1 Mal und maximal zwei bis n Mal vor.
    Denkbare Strings sind:

    Code
    Foo: Bar
    Foo: Bar:Baz
    Foo Bar: Baz - Quux
    Foo Bar: Baz: Quux

    usw.

    In der RegEx-Endfassung soll noch eine Muster-Alternative per "|" hinzukommen, so dass entweder der (erste!) Doppelpunkt oder ein anderes (Sonder-)Zeichen gematcht wird.
    Hat jemand eine Idee? :denk:

    Edit:
    Also, es geht - wenn auch, wie ich finde, umständlich:

    Code
    %SetPattRegExp='(?U)(.+)\s*:(?= )\s(?-U)(.+)'%-
    %RegExpBlindMatch='Foo Bar: Baz: Quux'%-
    %SubPatt='2'


    So bekäme ich meinen ersten Doppelpunkt, die SubPattern 1 und 2 enthalten "Foo Bar", bzw. "Baz: Quux". (Mit

    Code
    (:(?= ) | *(?= ))


    ließe sich die Muster-Alternative realisieren.)
    In einer vernünftigen Skriptsprache ließe sich sowas natürlich eleganter schreiben (via Attribut für Regex-Funktion), kein Vergleich zu Ritlabs' Makro-Gehunze.

    Einmal editiert, zuletzt von Mikka (21. Juni 2004 um 16:47)

  • Wo wird bei Dir ein Subpattern 3 geliefert?

    S1 liefert: Foo Bar
    S2 lefert: Baz: Quux

    Ich habs 10mal gelesen - weiss aber immer noch nicht was hinten rauskommen soll.

    Schoen editiert. :angry: Mache doch bitte einen neuen Beitrag, damit man eine Art Versionshistorie hat und man die einzelnen Gedankengaenge besser sehen kann.

    Man möchte manchmal Kannibale sein, nicht um den oder jenen aufzufressen, sondern um ihn auszukotzen. Johann Nestroy.

    Einmal editiert, zuletzt von Thomas Woelk (21. Juni 2004 um 16:48)

  • Ich geb's zu, losgelöst von meinem Vorhaben ist nicht sofort ersichtlich, was ich damit bezwecke.
    Ich lasse mir von einem Winamp-Plugin die aktuelle Titelinformation in eine Textdatei schreiben. Diese Datei enthält immer eine Zeile mit Interpret und Titel, z.B.:

    Ásmegin: Huldradans – Hin Grønnkledde

    Nun gibt es noch die Situation, dass Winamp eine CD wiedergibt. Die Titelinformation hierzu läuft momentan über CDDB, das Plugin schreibt dann die reguläre Winamp-Anzeige (und nicht die Inhalte von ID3-Tags) in die Textdatei, folgendermaßen:

    Ásmegin • Huldradans – Hin Grønnkledde

    (Ich nutze in Winamp das Sonderzeichen "•", um den Interpreten vom Titel zu trennen.)
    Der RegEx soll mit beiden Rückgaben umgehen können, herausbekommen möchte ich so etwas:

    Ásmegin ~ Huldradans – Hin Grønnkledde

    Der X-Now-Playing-Header bekommt dieses Resultat dann ggf. als Inhalt zugewiesen.

    Edit:
    Sorry, Thomas, dass sich das zeitlich überschnitten hat.

    Einmal editiert, zuletzt von Mikka (21. Juni 2004 um 16:59)

  • Wie waere es mit?

    Code
    %SETPATTREGEXP="(.+)\s*(\:|\x95)(?= )\s*(?-U)(.+)"

    Man möchte manchmal Kannibale sein, nicht um den oder jenen aufzufressen, sondern um ihn auszukotzen. Johann Nestroy.

    Einmal editiert, zuletzt von Thomas Woelk (21. Juni 2004 um 17:22)

  • Stimmt, die Alternative lässt sich zusammenfassen.
    Der Ausdruck sieht bei mir jetzt so aus:

    Code
    %SetPattRegExp='(?U)(.+)\s*(•|:)(?= )\s(?-U)(.+)'%-


    Und statt "•" klappt auch "\x95".
    Das "(?U)" am Anfang habe ich belassen, weil ich das optionale Whitespace nach dem ersten Subpattern sonst anders schreiben müsste.

    Die gesamte Verarbeitung sieht bei mir nun ungefähr so aus:

    Code
    %_TMP='%GMP_Envir("Temp")\now-playing.txt'%-
    %SetPattRegExp='(?U)(.+)\s*(•|:)(?= )\s(?-U)(.+)'%-
    %RegExpBlindMatch='%Put=*%_TMP*'%-
    %_NP=#%SubPatt='1' ~ %SubPatt='3'#%-
    %-
    %SetHeader('X-Now-Playing','%_NP')%-

    Wobei die %SetHeader-Anweisung in der letzten Zeile in Wirklichkeit mehr als dreimal so lang (und ein Zehntel so übersichtlich) ist. :pfeif:

    Einmal editiert, zuletzt von Mikka (21. Juni 2004 um 21:57)

  • Zitat

    Jetzt frag ich mich nur noch, wer sich immer jeden Header anzeigen lässt...bzw diesen X-Now-Playing ;) Fändest du eine Lösung direkt in der Mail hier nicht sinnvoller?


    Eine Signatur-Variante für die Mail hab ich auch. Allerdings ist die auf meine Bedürfnisse abgestimmt und noch etwas komplexer (prüft noch, ob now-playing.txt im angegebenen Verzeichnis existiert und größer als 0 Byte ist).

    Sähe dann beispielsweise so aus:

    (Eine Ausgabe erfolgt nur dann, wenn Winamp auch tatsächlich läuft.)

  • Darf man mal fragen wo du herkommst?

    Man möchte manchmal Kannibale sein, nicht um den oder jenen aufzufressen, sondern um ihn auszukotzen. Johann Nestroy.

  • Zitat

    Ich tippe aus Mannheim.


    Monnem? Wieso Monnem?
    *hat nichts gegen Mannheim*

    Edit:
    aus^Wauf, oder?

    Einmal editiert, zuletzt von Mikka (22. Juni 2004 um 11:32)

  • Zitat

    Eine Signatur-Variante für die Mail hab ich auch. Allerdings ist die auf meine Bedürfnisse abgestimmt und noch etwas komplexer (prüft noch, ob now-playing.txt im angegebenen Verzeichnis existiert und größer als 0 Byte ist).


    Hab ich neulich auf XMP umgestellt, war 'ne ziemliche Frickelei.
    Unglaublich wie schnell man bei dem Makrogelumpe den Durchblick verliert ...

    Code
    %_NP='%XMP_Envir("Temp")\now-playing.txt'%-
    %If:"%XMP_FileExist('%_NP')"="1":~%If:"%XMP_FileSize('%_NP','K')"!="0":"%-
    %SetPattRegExp='(?U)(.+)\s*(•|:)(?= )\s(?-U)(.+)'%-
    %RegExpBlindMatch='%Put=*%_NP*'%-
    %_SIG=#%SubPatt='1': %SubPatt='3'#%-
    %IsSignature-- 
    Momentan läuft
       %_SIG":""~:""%-

    Die Voraussetzungen:
    - TheBat! ab Version 2.x + XMP 1.x
    - Winamp ab Version 2.x + AMIP 2.5x

    Funktionsbeschreibung:
    Es wird überprüft, ob now-playing.txt unter %TMP% existiert.
    Falls ja, besteht der von Winamp gelieferte Inhalt aus einer Zeile wie

    Code
    Moonsorrow • Karhunkynsi


    Per regulären Operationen wird der String in zwei Subpatterns aufgedröselt.
    Diese werden dann, durch Doppelpunkt und Leerzeichen getrennt, in die Signatur reingeschrieben:

    Zitat

    --
    Momentan läuft
    Moonsorrow: Karhunkynsi