VINNUSAURUS:
Tengo una cadena {{m|gem-pro|*karzijan?||to turn}}
, cuando cada vez una cadena comienza con {{m
y termina con }}
i quieren envolvente to turn
con ()
cadena de ménsulas que viene antes}}
Cuerda: {{m|gem-pro|*karzijan?||to turn}}
Se requiere de la secuencia: {{m|gem-pro|*karzijan?||(to turn)}}
La cadena puede ser no sólo to turn
, sino cualquier cadena.
Allan:
Puede usar la siguiente expresión regular:
(\{\{m\|[^}]*\|)([^|}]*)(\}\})
y la sustitución:
\1(\2)\3
Entrada:
{{m|gem-pro|*karzijan?||to turn}}
{{m|gem-pro|*karzijan?||abc}}
{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}
{{do nothing}}
#do nothing
Salida:
{{m|gem-pro|*karzijan?||(to turn)}}
{{m|gem-pro|*karzijan?||(abc)}}
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}
{{do nothing}}
#do nothing
Demostración: https://regex101.com/r/yoo9KG/2/
explicaciones:
(\{\{m\|[^}]*\|)
capturará cadenas que comienzan por{{m
seguida de 0 a N caracteres que no son}
hasta alcanzar una|
, el último situado en su{{m...|...|..}}
estructura. El grupo de captura se puede hacer referencia hacia atrás a través de\1
([^|}]*)
coincidirá con la última cadena en su estructura y almacenarlo en el grupo de captura de segundo.(\}\})
capturará el último 2}
y almacenarla en el 3er grupo.- Se utiliza en el reemplazo de las 3 referencias hacia atrás y se rodea el segundo uno por paréntesis para llegar a su resultado.
el código de Java:
String input = "{{m|gem-pro|*karzijan?||to turn}},{{m|ine-pro|*gers-||to bend, turn}}";
String output = input.replaceAll("(\\{\\{m\\|[^}]*\\|)([^|}]*)(\\}\\})", "$1($2)$3");
System.out.println(output);
salida:
{{m|gem-pro|*karzijan?||(to turn)}},{{m|ine-pro|*gers-||(to bend, turn)}}