(Publicación en caso de que alguien podría tener un uso de ella).
que estaba buscando una solución para un problema un poco más sofisticado que OP - reemplazar cada ocurrencia de algo con el número por el mismo con número incrementado
P. ej Sustitución de algo como esto:
<row id="1" />
<row id="2" />
<row id="1" />
<row id="3" />
<row id="1" />
Por esto:
<row id="2" />
<row id="3" />
<row id="2" />
<row id="4" />
<row id="2" />
pude encontrar la solución en línea por lo que escribió mi propio guión en el maravilloso (un poco feo, pero hace el trabajo):
/**
* <p> Finds words that matches template and increases them by 1.
* '_' in word template represents number.
*
* <p> E.g. if template equals 'Row="_"', then:
* ALL Row=0 will be replaced by Row="1"
* All Row=1 will be replaced by Row="2"
* <p> Warning - your find template might not work properly if _ is the last character of it
* etc.
* <p> Requirments:
* - Original text does not contain tepmlate string
* - Only numbers in non-disrupted sequence are incremented and replaced
* (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be
* replaced by Row=5)
*/
def replace_inc(String text, int startingIndex, String findTemplate) {
assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder'
assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed'
assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)'
while (true) {
findString = findTemplate.replace("_",(startingIndex).toString())
if (!text.contains(findString)) break;
replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString())
text = text.replaceAll(findString, replaceString)
}
return text.replaceAll("_____","") // get rid of '_____' character
}
// input
findTemplate = 'Row="_"'
path = /C:\TEMP\working_copy.txt/
startingIndex = 0
// do stuff
f = new File(path)
outText = replace_inc(f.text,startingIndex,findTemplate)
println "Results \n: " + outText
f.withWriter { out -> out.println outText }
println "Results written to $f"
Los reemplazos de Notepad ++ no hacen matemática, ni tampoco regex. – Amber
Si es posible, es increíblemente difícil. No existe un concepto de números en las expresiones regulares (por lo que no hay +1) y no hay una manera fácil de acumular datos cuando se combina una expresión regular (por lo que no hay una coincidencia "siguiente"). XSLT podría ayudarlo aquí, si realmente necesita tener que automatizar esto. –
@Amber Notepad ++ tiene una funcionalidad de expresiones regulares limitada. – Karolis