regulares - regular expression javascript example
¿Cómo se mapean-reemplazan los caracteres en Javascript de forma similar a la función ''tr'' en Perl? (6)
En Perl, uno también puede escribir
tr{-_}{+/}
como
my %trans = (
''-'' => ''+'',
''_'' => ''/'',
);
my $class = join '''', map quotemeta, keys(%trans);
my $re = qr/[$class]/;
s/($re)/$trans{$1}/g;
Esta última versión seguramente puede implementarse en JS sin muchos problemas.
(Mi versión carece de la duplicación de la solución de Jonathan Lonowski).
He estado tratando de descubrir cómo mapear un conjunto de caracteres en una cadena a otro conjunto similar a la función tr
en Perl.
Encontré este sitio que muestra funciones equivalentes en JS y Perl , pero lamentablemente no hay tr equivalente.
la función tr
(transliteración) en Perl mapea los caracteres uno por uno, por lo que
data =~ tr|/-_|+/|;
mapa
- => + and _ => /
¿Cómo se puede hacer esto de manera eficiente en JavaScript?
Esto funciona, que son similares a cómo está construido en Perl.
function s(a, b){ $_ = $_.replace(a, b); }
function tr(a, b){ [...a].map((c, i) => s(new RegExp(c, "g"), b[i])); }
$_ = "Εμπεδοκλης ο Ακραγαντινος";
tr("ΑΒΓΔΕΖΗΘΙΚΛΜΝΟΠΡΣΤΥΦΧΩ", "ABGDEZITIKLMNOPRSTIFHO");
tr("αβγδεζηθικλμνοπρστυφχω", "abgdezitiklmnoprstifho");
s(/Ξ/g, "X"); s(/Ψ/g, "Ps");
s(/ξ/g, "x"); s(/ψ/g, "Ps");
s(/ς/g, "s");
console.log($_);
Esto mapeará todas las s a b
y todas las y
a z
var map = { a: ''b'', y: ''z'' };
var str = ''ayayay'';
for (var i = 0; i < str.length; i++)
str[i] = map[str[i]] || str[i];
EDITAR:
Aparentemente no puedes hacer eso con cuerdas. Aquí hay una alternativa:
var map = { a: ''b'', y: ''z'' };
var str = ''ayayay'', str2 = [];
for (var i = 0; i < str.length; i++)
str2.push( map[str[i]] || str[i] );
str2.join('''');
Método:
String.prototype.mapReplace = function(map) {
var regex = [];
for(var key in map)
regex.push(key.replace(/[/-/[/]///{/}/(/)/*/+/?/.///^/$/|]/g, "//$&"));
return this.replace(new RegExp(regex.join(''|''),"g"),function(word){
return map[word];
});
};
Un ejemplo perfecto:
var s = "I think Peak rocks!"
s.mapReplace({"I think":"Actually","rocks":"sucks"})
// console: "Actually Peak sucks!"
No hay un equivalente incorporado, pero puede acercarse a uno con replace
:
data = data.replace(/[/-_]/g, function (m) {
return {
''-'': ''+'',
''_'': ''/''
}[m];
});
No puedo responder por ''eficiente'', pero esto utiliza una expresión regular y una devolución de llamada para proporcionar el personaje de reemplazo.
function tr( text, search, replace ) {
// Make the search string a regex.
var regex = RegExp( ''['' + search + '']'', ''g'' );
var t = text.replace( regex,
function( chr ) {
// Get the position of the found character in the search string.
var ind = search.indexOf( chr );
// Get the corresponding character from the replace string.
var r = replace.charAt( ind );
return r;
} );
return t;
}
Para cadenas largas de búsqueda y reemplazo de caracteres, podría valer la pena ponerlos en un hash y hacer que la función vuelva de eso. es decir, tr / abcd / QRST / se convierte en hash {a: Q, b: R, c: S, d: T} y la devolución de llamada devuelve hash [chr].