replace mit regex und replacement pattern ($1)
Joachim
- javascript
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
Lässt sich sowas einfacher umgehen, als gleich mit einer callback-funktion zu arbeiten?
"a".replace(/(.+)/, "$1")
vs.
"a".replace(/(.+)/, "$$1")
Mathias
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
"$1" + "1" soll ergeben: "foo1".
"foo".replace(/(.+)/, "$1\u0031")
Mathias
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
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
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
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.
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
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
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