web-dev-qa-db-fra.com

Regex utilisant Java String.replaceAll

Je cherche à remplacer une valeur de chaîne Java comme suit. Le code ci-dessous ne fonctionne pas.

        cleanInst.replaceAll("[<i>]", "");
        cleanInst.replaceAll("[</i>]", "");
        cleanInst.replaceAll("[//]", "/");
        cleanInst.replaceAll("[\bPhysics Dept.\b]", "Physics Department");
        cleanInst.replaceAll("[\b/n\b]", ";");
        cleanInst.replaceAll("[\bDEPT\b]", "The Department");
        cleanInst.replaceAll("[\bDEPT.\b]", "The Department");
        cleanInst.replaceAll("[\bThe Dept.\b]", "The Department");
        cleanInst.replaceAll("[\bthe dept.\b]", "The Department");
        cleanInst.replaceAll("[\bThe Dept\b]", "The Department");
        cleanInst.replaceAll("[\bthe dept\b]", "The Department");
        cleanInst.replaceAll("[\bDept.\b]", "The Department");
        cleanInst.replaceAll("[\bdept.\b]", "The Department");
        cleanInst.replaceAll("[\bdept\b]", "The Department");

Quelle est la manière la plus simple de réaliser le remplacement ci-dessus?

8
user2072797

S'il s'agit d'une fonction que vous utilisez en continu, il y a un problème. Chaque expression régulière est à nouveau compilée pour chaque appel. Il est préférable de les créer sous forme de constantes. Vous pourriez avoir quelque chose comme ça.

private static final Pattern[] patterns = {
    Pattern.compile("</?i>"),
    Pattern.compile("//"),
    // Others
};

private static final String[] replacements = {
    "",
    "/",
    // Others
};

public static String cleanString(String str) {
    for (int i = 0; i < patterns.length; i++) {
        str = patterns[i].matcher(str).replaceAll(replacements[i]);
    }
    return str;
}
13
Paul Vargas
cleanInst.replaceAll("[<i>]", "");

devrait être:

cleanInst = cleanInst.replaceAll("[<i>]", "");

puisque la classe String est immuable et ne change pas son état interne, c'est-à-dire que replaceAll() retourne une nouvelle instance différente de cleanInst.

7
Eng.Fouad

Vous devriez lire un tutoriel de base expressions régulières .

Jusque-là, ce que vous avez essayé de faire peut se faire comme ceci:

cleanInst = cleanInst.replace("//", "/");
cleanInst = cleanInst.replaceAll("</?i>", "");
cleanInst = cleanInst.replaceAll("/n\\b", ";")
cleanInst = cleanInst.replaceAll("\\bPhysics Dept\\.", "Physics Department");
cleanInst = cleanInst.replaceAll("(?i)\\b(?:the )?dept\\b\\.?", "The Department");

Vous pourriez probablement chaîner toutes ces opérations de remplacement (mais je ne connais pas la bonne Java pour cela).

À propos des limites des mots : \b n'a généralement de sens que directement avant ou après un caractère alphanumérique.

Par exemple, \b/n\b ne correspondra qu'à /n s'il est directement précédé d'un caractère alphanumérique et suivi d'un caractère non alphanumérique, il correspond donc à "a/n!" mais non "foo /n bar".

3
Tim Pietzcker