8
votes

Regex en utilisant java string.replaceAll

Je cherche à remplacer une valeur de chaîne Java comme suit. Sous le code 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");


6 commentaires

Que voulez-vous dire par ne fonctionne pas?


Retirez les crochets ( [ et ] ). Ce sont pour les classes de caractères. Si quelque chose d'autre ne fonctionne pas, vous devrez être plus précis.


Êtes-vous au courant de ce qu'est une classe de personnages dans une regex? Regex.info


Les chaînes sont immuables .


et ignorer le modificateur de cas fonctionnerait pour beaucoup de remplace


Comme @slaks a souligné: les chaînes sont immuables. Votre code ne fera rien si vous ne stockez pas la valeur de retour de string.replaceall () quelque part. À l'heure actuelle, votre code ne fait rien avec la valeur de retour.


3 Réponses :


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

0 commentaires

3
votes

Vous devriez lire une base tutoriel d'expressions régulières .

jusque-là, quoi Vous avez essayé de faire peut être fait comme ceci: P>

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");


2 commentaires

+1 Votre réponse est plutôt bonne, mais pourquoi le groupe de non-capture pour "the"? Est-ce juste "performance"? Cos IMHO La lisibilité tombe plus que les augmentations de performance. Btw je soupçonne / n est censé être \ n


Je suis juste habitué à le faire comme ça. Je n'utilise jamais de saisir des parenthèses à moins que je ne veux capturer un groupe. Je conviens qu'il y a une tension entre dire clairement ses intentions et sa lisibilité.



14
votes

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


2 commentaires

Au lieu de Motif , nous avons maintenant matcher Les objets créés à chaque fois. Comment est-ce mieux?


Parce que la compilation d'un motif de regex est plus coûteuse que de créer un correspondant pour un motif (pré-compilé)?