67 votes

Supprimer tous les "mots" d'une chaîne en Java, en laissant des caractères accentués

Apparemment, la saveur Regex de Java considère les trémas et autres caractères spéciaux comme des "caractères non-mots" lorsque j'utilise Regex

         "TESTÜTEST".replaceAll( "\\W", "" )
 

renvoie "TESTTEST" pour moi. Ce que je veux, c’est que seuls soient supprimés tous les véritables «mots». Tout moyen de le faire sans avoir quelque chose dans le sens de

          "[^A-Za-z0-9äöüÄÖÜßéèáàúùóò]"
 

seulement pour réaliser que j'ai oublié ô?

156voto

Tim Pietzcker Points 146308

Utilisez [^\p{L}\p{Nd}]+ - cela correspond à tous les caractères (Unicode) qui ne sont ni des lettres ni des chiffres (décimaux).

En Java:

 String resultString = subjectString.replaceAll("[^\\p{L}\\p{Nd}]+", "");
 

Modifier:

J'ai changé \p{N} en \p{Nd} car l'ancien correspond également à des symboles numériques tels que ¼ ; ce dernier ne le fait pas. Voir sur regex101.com .

7voto

Mena Points 12283

J'essayais de faire exactement le contraire quand je suis tombé sur ce fil. Je sais que c'est assez vieux, mais voici quand même ma solution. Vous pouvez utiliser des blocs, voir ici . Dans ce cas, compilez le code suivant (avec les importations appropriées):

 > String s = "äêìóblah"; 
> Pattern p = Pattern.compile("[\\p{InLatin-1Supplement}]+"); // this regex uses a block
> Matcher m = p.matcher(s);
> System.out.println(m.find());
> System.out.println(s.replaceAll(p.pattern(), "#"));
 

Vous devriez voir la sortie suivante:

vrai

#blabla

Meilleur,

6voto

Stefan Haberl Points 764

Parfois, vous ne voulez pas de simplement supprimer les caractères, mais seulement de supprimer les accents. Je suis venu avec l'utilitaire suivant la classe que j'utilise dans mon Java RESTE des projets web à chaque fois que j'ai besoin d'inclure une Chaîne dans une URL:

import java.text.Normalizer;
import java.text.Normalizer.Form;

import org.apache.commons.lang.StringUtils;

/**
 * Utility class for String manipulation.
 * 
 * @author Stefan Haberl
 */
public abstract class TextUtils {
    private static String[] searchList = { "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß" };
    private static String[] replaceList = { "Ae", "ae", "Oe", "oe", "Ue", "ue",
            "sz" };

    /**
     * Normalizes a String by removing all accents to original 127 US-ASCII
     * characters. This method handles German umlauts and "sharp-s" correctly
     * 
     * @param s
     *            The String to normalize
     * @return The normalized String
     */
    public static String normalize(String s) {
        if (s == null)
            return null;

        String n = null;

        n = StringUtils.replaceEachRepeatedly(s, searchList, replaceList);
        n = Normalizer.normalize(n, Form.NFD).replaceAll("[^\\p{ASCII}]", "");

        return n;
    }

    /**
     * Returns a clean representation of a String which might be used safely
     * within an URL. Slugs are a more human friendly form of URL encoding a
     * String.
     * <p>
     * The method first normalizes a String, then converts it to lowercase and
     * removes ASCII characters, which might be problematic in URLs:
     * <ul>
     * <li>all whitespaces
     * <li>dots ('.')
     * <li>(semi-)colons (';' and ':')
     * <li>equals ('=')
     * <li>ampersands ('&')
     * <li>slashes ('/')
     * <li>angle brackets ('<' and '>')
     * </ul>
     * 
     * @param s
     *            The String to slugify
     * @return The slugified String
     * @see #normalize(String)
     */
    public static String slugify(String s) {

        if (s == null)
            return null;

        String n = normalize(s);
        n = StringUtils.lowerCase(n);
        n = n.replaceAll("[\\s.:;&=<>/]", "");

        return n;
    }
}

Être un allemand de haut-parleur, j'ai inclus le traitement approprié des accents ainsi - la liste doit être facile d'étendre à d'autres langues.

HTH

EDIT: Notez qu'il peut être dangereux pour inclure la Chaîne de retour dans une URL. Vous devriez au moins de codage HTML pour empêcher les attaques XSS.

2voto

Epaga Points 12717

Eh bien, voici une solution avec laquelle je me suis retrouvé, mais j'espère qu'il y en a une plus élégante ...

 StringBuilder result = new StringBuilder();
for(int i=0; i<name.length(); i++) {
    char tmpChar = name.charAt( i );
    if (Character.isLetterOrDigit( tmpChar) || tmpChar == '_' ) {
        result.append( tmpChar );
    }
}
 

result aboutit au résultat souhaité ...

1voto

István Points 357

Vous voudrez peut-être commencer par supprimer les accents et les signes diacritiques , puis vérifiez à chaque position de caractère si la chaîne "simplifiée" est une lettre ascii. Si c'est le cas, la position d'origine doit contenir des caractères, sinon elle peut être supprimée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X