Supprimez tous les caractères non verbaux d’une chaîne dans Java, en laissant des caractères accentués?

Apparemment, la saveur Regex de Java compte les Umlauts et autres caractères spéciaux en tant que “caractères de mots” lorsque j’utilise Regex.

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

renvoie “TESTTEST” pour moi. Ce que je veux, c’est que seuls tous les véritables “caractères de mots” soient supprimés. 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é ô?

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:

 Ssortingng resultSsortingng = subjectSsortingng.replaceAll("[^\\p{L}\\p{Nd}]+", ""); 

Modifier:

J’ai changé \p{N} en \p{Nd} car le premier correspond aussi à certains symboles numériques tels que ¼ ; ce dernier ne le fait pas. Voir sur regex101.com .

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

 > Ssortingng s = "äêìóblah"; > Pattern p = Pattern.comstack("[\\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,

Parfois, vous ne voulez pas simplement supprimer les caractères, mais simplement supprimer les accents. J’ai créé la classe d’utilitaires suivante que j’utilise dans mes projets Web Java REST 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.SsortingngUtils; /** * Utility class for Ssortingng manipulation. * * @author Stefan Haberl */ public abstract class TextUtils { private static Ssortingng[] searchList = { "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß" }; private static Ssortingng[] replaceList = { "Ae", "ae", "Oe", "oe", "Ue", "ue", "sz" }; /** * Normalizes a Ssortingng by removing all accents to original 127 US-ASCII * characters. This method handles German umlauts and "sharp-s" correctly * * @param s * The Ssortingng to normalize * @return The normalized Ssortingng */ public static Ssortingng normalize(Ssortingng s) { if (s == null) return null; Ssortingng n = null; n = SsortingngUtils.replaceEachRepeatedly(s, searchList, replaceList); n = Normalizer.normalize(n, Form.NFD).replaceAll("[^\\p{ASCII}]", ""); return n; } /** * Returns a clean representation of a Ssortingng which might be used safely * within an URL. Slugs are a more human friendly form of URL encoding a * Ssortingng. * 

* The method first normalizes a Ssortingng, then converts it to lowercase and * removes ASCII characters, which might be problematic in URLs: *

    *
  • all whitespaces *
  • dots ('.') *
  • (semi-)colons (';' and ':') *
  • equals ('=') *
  • ampersands ('&') *
  • slashes ('/') *
  • angle brackets ('< ' and '>') *
* * @param s * The Ssortingng to slugify * @return The slugified Ssortingng * @see #normalize(Ssortingng) */ public static Ssortingng slugify(Ssortingng s) { if (s == null) return null; Ssortingng n = normalize(s); n = SsortingngUtils.lowerCase(n); n = n.replaceAll("[\\s.:;&=<>/]", ""); return n; } }

En tant que conférencier allemand, j’ai inclus le traitement correct des trémas allemands – la liste devrait être facile à étendre pour d’autres langues.

HTH

EDIT: notez qu’il peut être dangereux d’inclure la chaîne renvoyée dans une URL. Vous devriez au moins HTML le coder pour empêcher les attaques XSS.

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

 SsortingngBuilder result = new SsortingngBuilder(); for(int i=0; i 

result se termine avec le résultat souhaité ...

Vous pouvez supprimer les accents et les signes diacritiques , puis à chaque position de caractère, vérifier si la chaîne “simplifiée” est une lettre ASCII – si c’est le cas, la position d’origine doit contenir des caractères verbaux.

Vous pouvez utiliser SsortingngUtils d’Apache