Joachim: replace mit regex und replacement pattern ($1)

Hi,

bastle grade mit sowas herum:
return str.replace(regex, "$1" + repl);

soweit, sogut. Unschön dabei: ist repl ein numerischer  Wert wie 1, macht er - sofern verfügbar -  aus $1 $11 und gibt diesen Match zurück (Ist $11 nicht verfügbar setzt er brav "[match]1" zusammen).
Lässt sich sowas einfacher umgehen, als gleich mit einer callback-funktion zu arbeiten?

Danke & Gruesse, Joachim

--
Am Ende wird alles gut.
  1. Lässt sich sowas einfacher umgehen, als gleich mit einer callback-funktion zu arbeiten?

    "a".replace(/(.+)/, "$1")
    vs.
    "a".replace(/(.+)/, "$$1")

    Mathias

    1. Hi,

      "a".replace(/(.+)/, "$$1")

      hm, ich denke, ich habe mich unklar ausgedrückt... diese Lösung maskiert das $-Zeichen und gibt "$1" zurück. Mein Problem liegt jedoch darin, dass ich den Match aus $1 mit einem numerischen String zusammenfügen möchte. Also, Annahme, in $1 steckt "foo":

      "$1" + "1" soll ergeben: "foo1".

      Machts auch, solange es keinen Match $11 gibt. Wenn es diesen gibt, wird er zurückgegeben, offenbar hat js hier keine Möglichkeit zu unterscheiden, ob $1 + "1" oder $11 gemeint ist.

      Gruesse, Joachim

      --
      Am Ende wird alles gut.
      1. "$1" + "1" soll ergeben: "foo1".

        "foo".replace(/(.+)/, "$1\u0031")

        Mathias

        1. Hi,

          "foo".replace(/(.+)/, "$1\u0031")

          nun wäre ja die nötige Umrechnung in Unicode nicht sehr komfortabel, aber ich hatte die Idee, einfach unicode-null dazwischen zu schieben:

          var regex   =  /^([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)$/i;
              var str     =  "a1b2d3e4f5g6";

          function sx_replacer(str, repl, regex) {
                  return str.replace(regex, "$1" + "\u0000" + repl);
              }
              alert(sx_replacer(str, "55", regex)); // ergibt a55
              alert(sx_replacer(str, "1", regex));  // ergibt a1

          Das scheint zu funktionieren... Danke!

          Gruesse, Joachim

          --
          Am Ende wird alles gut.
          1. hallo again Joachim,

            ... aber ich hatte die Idee, einfach unicode-null dazwischen zu schieben:
            ...
            ... return str.replace(regex, "$1" + "\u0000" + repl);
            ...

            das ist in der tat ein eleganter kniff ...

            Das scheint zu funktionieren... Danke !

            ... der leider sowohl in khtml-basierten browsern (safari/google chrome),
            als auch im msie sowie im opera nicht traegt.

            so long - peterS. - pseliger@gmx.net

            --
            »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
            Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
            ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
            1. Hi,

              ... der leider sowohl in khtml-basierten browsern (safari/google chrome),
              als auch im msie sowie im opera nicht traegt.

              wie betrüblich... dann wirds wohl doch die callback variante ;-(

              Gruesse, Joachim

              --
              Am Ende wird alles gut.
  2. bastle grade mit sowas herum:
    return str.replace(regex, "$1" + repl);

    soweit, sogut. Unschön dabei: ist repl ein numerischer  Wert wie 1, macht er - sofern verfügbar -  aus $1 $11 und gibt diesen Match zurück (Ist $11 nicht verfügbar setzt er brav "[match]1" zusammen).
    Lässt sich sowas einfacher umgehen, als gleich mit einer callback-funktion zu arbeiten?

    Ich verstehe nicht was du meinst. Kannst du mal ein Beispiel zeigen?

    Struppi.

    1. Hi,

      Ich verstehe nicht was du meinst. Kannst du mal ein Beispiel zeigen?

      jep, hoffe das ist besser:
          var regex   =  /^([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)$/i;
          var str     =  "a1b2d3e4f5g6";

      function sx_replacer(str, repl, regex) {
              return str.replace(regex, "$1" + repl);
          }
          alert(sx_replacer(str, "55", regex)); // ergibt wie gewünscht a55
          alert(sx_replacer(str, "1", regex));  // ergibt "g" anstelle von a1

      die regex ist natürlich banane, bitte nur als testcase betrachten.

      Gruesse, Joachim

      --
      Am Ende wird alles gut.
  3. gruss Joachim,

    Lässt sich sowas einfacher umgehen, als gleich
    mit einer callback-funktion zu arbeiten?

    noe, du kommst um einen »callback« nicht herum ...
    ... Dein beispiel aufgreifend:

    Array.make=(function(list){var arr;if(list&&(typeof list.length=="number")){arr=Array.prototype.slice.call(list)}return arr});  
      
      
    var regex = /^([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)([a-z]+)([0-9]+)$/i;  
    var str = "a1b2d3e4f5g6";  
      
    function sx_replacer (str, repl, regex) {  
      
      return str.replace(regex, (function () {  
      
        alert((({}).toSource && Array.make(arguments).toSource()) || Array.make(arguments).toString());  
        return (arguments[1] + repl);  
      }));  
    //return ("\"" + str.replace(regex, "$155") + "\" bzw. \"" + str.replace(regex, "$11") + "\"");  
    }  
    alert(sx_replacer(str, "55", regex)); // ergibt wie gewünscht a55  
    alert(sx_replacer(str, "1", regex));  // ergibt jetzt wie gewünscht a1
    

    so long - peterS. - pseliger@gmx.net

    --
    »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
    Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
    ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
    1. Hi,

      noe, du kommst um einen »callback« nicht herum ...

      na gut, meine Variante:

      // search for somthing with
          // chars, followed by numbers, followed by chars again...
          // and replace the numbers
          //
          var regex   =  /^([a-z]+)([0-9]+)([a-z]+)$/i;
          var str     =  "Andre23xxl";

      // rebuild string like this: match1, replace, match3
          //
          var rebuild =  [1,-1,3];

      function sx_replacer(str, repl, regex, rebuild) {

      // callback
              // arguments: matched string, match1, match2..., offset, string
              //
              return str.replace(regex, function(){
                  var i, r, tmp = "";
                  for (i = 0; r = rebuild[i]; i++) {
                      tmp += (r == -1)? repl : ((typeof arguments[r] != "undefined")? arguments[r] : "");
                  }
                  return tmp;
              });
          }

      alert(sx_replacer(str, "1", regex, rebuild));

      Gruesse, Joachim

      --
      Am Ende wird alles gut.