Hasso: Suche Muster für "Kleinbuchstaben gefolgt von Großbuchstaben"

Liebe Foristen,

ich suche einen regulären Ausdruck, um einen Kleinbuchstaben oder eine Zahl gefolgt von einem Großbuchstaben zu matchen.

Ich habe den String "Aalbach, JanPhoenix" und möchte das durch "Aalbach, Jan - Phoenix" ersetzen.

Ich habe es mit ([a-z0-9])([A-Z]) versucht, aber das ergibt keinen Treffer.

Gruß Hasso

  1. Hallo Hasso,

    für Standard-ASCII-Buchstaben ist das so erstmal richtig und sollte den JanPhillip finden. Wenn es das nicht tut, liegt was anderes im Argen.

    Hinzu kommt: Bei Namen wie René Martin oder gar Stephanus Ägidius versagt das Pattern. Hier sind die Unicode-Zeichenkategorien gefragt: \p{Ll} für Kleinbuchstaben und \p{Lu} für Großbuchstaben. Und \p{Nd} für Ziffern, wo wir schon dabei sind. Das Pattern könnte also lauten:

    (\p{Ll}|\p{Nd})(\p{Lu})

    Wobei sich mit der Sinn der Ziffern nicht erschließt. Außer R2D2 habe ich noch niemanden kennengelernt, dessen Vorname auf eine Ziffer endete 🤖.

    Allerdings ist nicht Regex-Engine gleich Regex-Engine. Welche verwendest Du? In den meisten Fällen wird hier die Angabe der Programmiersprache genügen 😉. Das konkrete Statement, das Du programmiert hast, wäre auch interessant.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      Wobei sich mit der Sinn der Ziffern nicht erschließt. Außer R2D2 habe ich noch niemanden kennengelernt, dessen Vorname auf eine Ziffer endete 🤖.

      Glaube ich nicht, kennst bestimmt noch mehr.😀

      H7-25

      Otto 1

      T-800, T-1000, T-850,…

      Ich glaube die Linkfunktion versagt bei URL's mit Klammern.

      Gruss
      Henry

      --
      Meine Meinung zu DSGVO & Co:
      „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
      1. @@Henry

        Ich glaube die Linkfunktion versagt bei URL's mit Klammern.

        Hab ich mal berichtigt.

        [Otto 1](https://de.wikipedia.org/wiki/Otto_I._(HRR\)) Der Backslash stört. Wo kommt der her? @Christian Kruse

        Das hatten wir doch gerade schon mal.

        LLAP 🖖

        --
        „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
        „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

        —Marc-Uwe Kling
    2. Hallo Rolf,

      ich brauche das für den FlashRenamer. Welche Regex-Engine der verwendet, weiß ich nicht. Dein Pattern hat aber nichts gebracht.

      Trotzdem vielen Dank

      Hasso

      1. Hallo Hasso,

        ich habe mir die Anleitung angeschaut. Möglicherweise versteht der FlashRenamer die Angabe [a-z0-9] nicht, diese Variante ist nämlich nicht aufgeführt. Die \p{} Unicode-Gruppen versteht er auch nicht. Hast Du mal ([a-z])([A-Z]) getestet?

        Wenn das funktioniert, könnte man die Ziffern mittels eines ODER hinzunehmen:

        ([a-z]|[0-9])([A-Z])

        Ansonsten bin ich mit meinem Latein, Griechisch und ggf. auch Klingonisch am Ende.

        Rolf

        --
        sumpsi - posui - clusi
  2. Hello,

    in welchem Umfeld, innerhalb welcher Sprache benutzt Du das Muster? Wie sind dort die Voreinstellungen für Casesensivity?

    Ich hätte gedacht, dass Du nur lauter falsche Treffer bekommst.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  3. @@Hasso

    ich suche einen regulären Ausdruck, um einen Kleinbuchstaben oder eine Zahl gefolgt von einem Großbuchstaben zu matchen.

    Ich habe den String "Aalbach, JanPhoenix" und möchte das durch "Aalbach, Jan - Phoenix" ersetzen.

    Ich habe es mit ([a-z0-9])([A-Z]) versucht, aber das ergibt keinen Treffer.

    Dann machst du was falsch:

    "Aalbach, JanPhoenix".match(/([a-z0-9])([A-Z])/);
    

    ergibt: Array(3) [ "nP", "n", "P" ]

    Allerdings ist dein Suchausdruck nicht richtig:

    "Aalbach, RenéPhoenix".match(/([a-z0-9])([A-Z])/);
    

    ergibt: null

    LLAP 🖖

    --
    „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
    „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

    —Marc-Uwe Kling
    1. Hallo,

      Dann machst du was falsch:

      Vielleicht aber auch nicht.
      Möglicherweise steckt zwischen dem Klein- und dem folgenden Großbuchstaben einfach noch ein unsichtbares Zeichen…

      Gruß
      Kalk

      1. Hello,

        Dann machst du was falsch:

        Vielleicht aber auch nicht.
        Möglicherweise steckt zwischen dem Klein- und dem folgenden Großbuchstaben einfach noch ein unsichtbares Zeichen…

        Das hieße also, dass man den String vorher durch den/einen Normalizer schicken sollte?

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hallo,

          Das hieße also, dass man den String vorher durch den/einen Normalizer schicken sollte?

          Könnte sein.
          Ich hätte erst mal geguckt, wo kommt der String eigentlich her, warum ist der denn so verstümmelt?

          Gruß
          Kalk

      2. Hallo Kalk,

        nein, dazwischen steckt nichts.

        Gruß Hasso

    2. Hallo Gunnar,

      dass der Suchausdruck nicht richtig ist, ist mir klar. Sonst hätte ich diesen Post nicht verfasst. Nur wüsste ich gerne, wie der richtige denn lauten müsste 😊

      Trotzdem Danke

      Gruss Hasso

      1. @@Hasso

        Nur wüsste ich gerne, wie der richtige denn lauten müsste 😊

        Im Bereich bis U+00FF (Basic Latin und Latin-1 Supplement) sind die Groß- und Kleinbuchstaben jeweils gruppiert, sodass man die mit [A-ZÀ-ÖØ-Þ] bzw. [a-zß-öø-ÿ] angeben kann. Schon besser als nur [A-Z] und [a-z]; vielleicht reicht das ja für deine Zwecke.

        Ab U+0100 (Latin Extended-A, …) geht das nicht mehr; Groß- und Kleinbuchstaben sind alternierend. Da braucht man dann die Unicode-Zeichenkategorien wie von Rolf gezeigt – sofern die jeweilige Regexp-Engine das unterstützt.

        Ansonsten fiele mir noch ein, die Strings in NFD (decomposed) umzuwandeln (sofern die jeweilige Programmiersprache das unterstützt) und dann sowas wie [A-Z][\u{0300}-\u{0362}]* bzw. [a-z][\u{0300}-\u{0362}]* zu verwenden (U+0300 bis U+0362 sind kombinierende diakritische Zeichen) und hinterher wieder in NFC (composed) zu konvertieren. Das wäre aber eher ein übler Hack als eine vernünftige Lösung.

        LLAP 🖖

        --
        „Man kann sich halt nicht sicher sein“, sagt der Mann auf der Straße, „dass in einer Gruppe Flüchtlinge nicht auch Arschlöcher sind.“
        „Stimmt wohl“, sagt das Känguru, „aber immerhin kann man sich sicher sein, dass in einer Gruppe Rassisten nur Arschlöcher sind.“

        —Marc-Uwe Kling
  4. Hallo,

    Ich habe es mit ([a-z0-9])([A-Z]) versucht, aber das ergibt keinen Treffer.

    Dann empfehle ich den Total Commander, mit dem klappt das.

    Gruß
    Kalk

    Edith weint, dass der René auch vom TC ignoriert wird…

  5. Vielen Dank an alle Helfer!

    Ich habe es jetzt hinbekommen:

    Such-Pattern: (.+)([a-z0-9])([A-Z])(.+)

    Replace-Pattern: $1$2 - $3$4

    Funktioniert allerdings nur, wenn es im String nur **einen **Wechsel Kleinbuchstabe/Großbuchstabe gibt.

    Aber das erspart mir schon viel Handarbeit.

    --
    Gruß Hasso
    1. Hallo Hasso,

      Ich habe es mit ([a-z0-9])([A-Z]) versucht, aber das ergibt keinen Treffer.

      Ich habe es jetzt hinbekommen: Such-Pattern: (.+)([a-z0-9])([A-Z])(.+)

      Man muss nicht verstehen, warum das Pattern auf einmal Treffer bringt, wenn es vorher keine brachte. Oder sind die Patterns vom FlashRenamer automatisch geankert (d.h. er denkt sich grundsätzlich ein ^ davor und ein $ dahinter)? In dem Fall wäre ggf. .* besser statt .+, weil es ja auch den Ausnahmefall geben kann, dass das zu ersetzende Pärchen ganz am Anfang oder Ende des Namens steht.

      Rolf

      --
      sumpsi - posui - clusi