Martin Hein: reguläre ausdrücke

hallo forum,

ich versuche, mir 'reguläre ausdrücke' beizubringen,
um das extendet search&replace meines codeeditors
efektiver nutzen zu können. ganz schön mächtig!

ich suche alle vorkommen von:

<zahl mit n ziffern und evt. tsd.-tennz.> m2

und will das tausender-trennzeichen "." durch das englische ","
ersetzen.

kann mir jemdna dabei helfen?

danke und

beste gruesse,
martin

  1. hallo forum,

    hab den regulären ausdruck für die suche selbst hinbekommen.

    [0-9]*.[0-9]{3} m²

    was ich nun noch nicht begreife ist, wie bei agument für
    replace aussehen soll. aber ich weiss selbst nicht, ob das
    nun hier hingehört.

    beste gruesse,
    heintz

    1. hi,

      hab den regulären ausdruck für die suche selbst hinbekommen.

      [0-9]*.[0-9]{3} m²

      was ich nun noch nicht begreife ist, wie bei agument für
      replace aussehen soll.

      Da du bestimmte Teile deines Suchtreffers übernehmen willst, brauchst du sog. Backreferences. Diese werden "erzeugt", in dem du Teilausdrücke klammerst:

      ([0-9]*).([0-9]{3}) m² oder
      ([0-9]*).([0-9]{3} m²)

      Damit bekommst du jeweils die Teile des Treffers, die in Klammern stehen, als Backreferences, so dass du sie beim Ersetzen wieder benutzen kannst.
      Wie man diese Backreferences dabei anspricht, kommt auf die RegEx-Implementierung - gängig sind bspw. $1 oder \1, wobei die Ziffer dann für die Position der Backreference im Suchausdruck steht.

      Und da du den Punkt durch ein Komma ersetzen willst, fügst du beim Replacen dann Backreferences #1, ein Komma, und Backreferences #2 wieder zusammen.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. FETT !!!

        ... bin begeistert. super erklärt: kurz, verständlich, eindeutig.

        ... und hab mein universum damit um lichjahre aufgebohrt !

        ('1.000' || '1,000') dank und beste wünsche,
        martin

      2. gudn tach!

        ([0-9]*).([0-9]{3} m²)

        (literale) punkte muessen mit backslash maskiert werden.

        und falls mehrere punkte vorkommen, z.b. in "1.000.000", dann wird der erste punkt nicht gematcht. statt "[0-9]" kann man uebrigens auch kuerzer "\d" schreiben.

        also ich wuerde es mal (in perl-schreibweise) mit

        s/(\d+).(?=\d{3}(?:.\d{3})+ m2)/$1,/g
          (ungetestet)

        versuchen. fuer (?=...) schau mal im handbuch (perldoc perlman) unter "positive look-ahead assertion".

        soweit klar? funzt's?

        und natuerlich kann ich es mir wieder nicht verkneifen, darauf hinzuweisen, dass sowohl punkte als auch kommas weitgehend vermieden werden sollten als zifferngruppierungszeichen.

        prost
        seth

        1. gudn tach!

          s/(\d+).(?=\d{3}(?:.\d{3})+ m2)/$1,/g

          moep!
          einen fehler habe ich gefunden. richtiger ist
            s/(\d+).(?=\d{3}(?:.\d{3})* m2)/$1,/g

          perldoc perlman

          aeh, und hier meinte ich perldoc perlre.

          prost
          seth

  2. Hallo Martin,

    ich versuche, mir 'reguläre ausdrücke' beizubringen (...)

    In Eclipse gibt es bei der Suche einen tollen Assistenten, wenn das Häkchen regüläre (der Name stammt aus der Türkei) Ausdrücke aktiviert ist.

    Und ein gutes Programm ist auch der Regex Coach

    Gruß, der Arbeitslose