Utiliser Regex pour remplacement
Comment peut-on utiliser des regex pour remplacer des morceux de texte.
Voici l'exemple sur lequel je travaille:
Dans un ensemble des fichiers, je dois remplacer les occurences
Code:
<a * href= * > * </a>
par
Code:
<html:link * url= * > * </html:link>
* - signifie un texte quelconque
C'est à dire qu'il faut remplacer la balise 'a' par 'html:link' et 'href' par 'url' sans modifier le texte qui se trouve entre ces éléments.
remplacer des occurences RegExpression
c'est la methode courante avec des Strings de comparaison.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| try{ bos.close(); } catch (IOException e) {} finally {
for(int j = 0; j < regText.length; j++) {
try{
JTextField field = (JTextField)regText[j];
if(!field.getText().equals("") && !field.getText().equals(regTextDefault))
buffer = new String(buffer).replaceAll(field.getText(),((JTextField)adjText[j]).getText()).getBytes();
} catch (ClassCastException e) { break; }
}
log.pushNewLog("making the replacement file of " + files[i].getName() + ":");
preparedFiles[i] = new File(files[i].getPath()); // + ".rdy");
bos = new Out(new FileOutputStream(preparedFiles[i].getPath()));
off = 0;
try {
while(true) {
bos.write(buffer,off++,buffer.length);
}
} catch (AsynchronousCloseException e) { throw e; } catch(IndexOutOfBoundsException e) {
log.pushNewLog(".");
} finally {
try{ bos.close(); } catch (IOException e){} finally {
log.pushNewLog("done.");
continue;
}
}
} |
la deuxieme methode, moins evidente, peut-etre meconnue:
Code:
1 2 3 4 5 6 7
| sw_printStrings.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Formatter formatter = new Formatter(sw_log); // la classe Formatter prend en argument du contructeur un composant Appendable de sortie, le formatage s'imprime sur celle-ci for(int i = 0; i < Strings.length; i++) {
if(Strings[i] != null)
formatter.format(sw_formatPrintStrings.getText(), Strings[i], i);
/* les agruments peuvent varier en nombre, ici le premier est le formatage RegularExpression avec les arguments qui suivent: ici l'objet du tableau Strings[i] et le nombre i */ }
}}); |
La deuxieme methode est la plus puissante en terme de modularite (c.f. format javadoc), car elle permet de mettre en forme du texte à l'aide d'une simple fonction vers une sortie Appendable évidente. Toutefois il est certain que la première solution (c.f. replaceAll javadoc)est la plus simple, car il n'est pas necessaire de connaitre le formatage Regular Expression du texte, cela dit assez complexe.