Acceder

Ver la Versión Completa : [ CONSULTA ] Regex: reemplazar un intro solo si le preceden x numero de intros


mlesir
09/12/14, 20:19:39
La verdad es que el tema lo tengo solucionado de otra manera pero me jode cantidad no conseguirlo con regex.
Lo que quiero es esto:
Tengo una variable (%Var) con cinco lineas de texto separadas por un salto de linea o intro, por ejemplo:
%Var= linea uno
linea dos
linea tres
linea cuatro
linea cinco
Lo que quiero es que mediante la acción de buscar y reemplazar de tasker cada intro que encuentre lo sustituya por "
%for:" ( o sea por intro %for: ). La variable %for es la variable que va cogiendo todos los valores de un array que digamos que son A, B,C,D,E.
Lo de poder meter un intro en el parámetro para sustituir se puede hacer poniendo una variable que se iguale a intro ya que no te deja escribir un intro en ese parametro. Así que finalmente lo que quiero es que %Var se quede así:

A: linea uno
B: linea dos
C: linea tres....
etc.

El problema claro es que como metes un intro como sustitución la siguiente pasada que hace FOR encuentra coincidencia con lo ya sustituido (Lo de meter el intro en la sustitución no es opcional tengo que hacerlo si o si).
Por eso lo que quiero es poder decirle que sustituya en la primera pasada la primera coincidencia, en la segunda solo la segunda. Creo que se podría hacer indicando que no lo sustituya si no va precedido ese intro de X intro siendo X una variable a modo de contador que va aumentando.
No se si me he explicado muy bien. En resumidas cuentas lo que quiero es poder decirle que solo sustituya el intro si (por ejemplo ) hay antes tres intros.
Gracias.

EDITO: Se me olvida comentar que solo quiero que sustituya el intro ni lo de antes ni lo de después.
Probado los paréntesis {n} los (?=lo que sea) etc y nada no hay manera.

maid450
12/12/14, 10:42:29
Me parece que con expresiones regulares no podrías conseguir esto, al menos no de forma simple.
Personalmente usaría un javascriptlet que haría esto muy rápido:

var txt = global('Var');
var letras = ['A','B','C'];
txt = txt.split('\n');
txt = txt.map(function(line, index) { return letras[index] + ': ' + line;});
setGlobal('Var', txt.join('\n'));


explico linea a linea:
var txt = global('Var');
almacenamos el contenido de %Var en una variable local txt para trabajar más comodamente con ella, si %Var no tiene por qué ser global puedes omitir esto y reemplazar en las demás lineas "txt" por el nombre de la variable tasker (sin el %)
var letras = ['A','B','C'];
Declaramos el array de letras, si lo defines desde Tasker cambia en el resto del script "letras" por el nombre del array sin el %
txt = txt.split('\n');
troceamos el texto por los saltos de linea (intros) es como la acción "separar" de tasker, asi que ahora txt será un array.
txt = txt.map(function(line, index) { return letras[index] + ': ' + line;});
esta es la que hace el trabajo, usamos la función map que lo que hace es dejarnos ejecutar una funcion para cada elemento de un array, y esta funcion concatena la letra de la posicion en la que estemos con un ": " y el contenido de la linea. Esto se podría hacer con un for, pero así es mucho más eficiente y rápido
setGlobal('Var', txt.join('\n'));
guardamos de nuevo en %Var el resultado de unir el array resultante (algo del tipo [A: linea 1, B: linea 2,...]) con saltos de linea (es como un "separar" inverso)