Comment supprimer des caractères spéciaux d'une chaîne?


90

Je souhaite supprimer des caractères spéciaux comme:

- + ^ . : ,

à partir d'une chaîne utilisant Java.


Vous savez apparemment déjà ce qu'est une expression régulière en fonction de la façon dont vous avez tagué votre question. Avez-vous essayé de lire la documentation de la Stringclasse? En particulier, recherchez le mot «regex»; il y a quelques méthodes, et un peu de réflexion devrait vous dire comment procéder ... :)
Karl Knechtel

3
L'expression «caractère spécial» est tellement surutilisée qu'elle n'a presque aucun sens. Si ce que vous voulez dire est, "J'ai cette liste de caractères spécifiques que je veux supprimer", alors faites comme Thomas le suggère et formez votre modèle avec une classe de caractères regex et replaceAlleux. Si vous avez des exigences plus ésotériques, modifiez la question. :)
Ray Toal

1
ce ne sont pas des caractères spéciaux ... ce sont: äâêíìéè car ce ne sont pas vos types de caractères courants à 1 octet comme - + ^ sont ... de toute façon, comme Ray l'a dit, faites un replaceAllpour eux, ou faites une analyse sur la chaîne, ajoutez les caractères qui ne sont pas les caractères que vous voulez retirer à une autre chaîne et à la fin, faites simplement un + = à une chaîne que vous retournerez.
Gonçalo Vieira du

deleteChars.apply( fromString, "-+^.:," );- trouver deleteChars ici
Kaplan

Réponses:


255

Cela dépend de ce que vous définissez comme caractères spéciaux, mais essayez replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

Notez que le ^caractère ne doit pas être le premier de la liste, car vous devrez alors l'échapper ou cela signifierait "tout sauf ces caractères".

Autre note: le -caractère doit être le premier ou le dernier de la liste, sinon vous devrez l'échapper ou il définirait une plage (par exemple, :-,cela signifierait "tous les caractères de la plage :à ,).

Ainsi, afin de maintenir la cohérence et ne pas dépendre de positionnement de caractère, vous voudrez peut - être échapper à tous ces personnages qui ont une signification particulière dans les expressions régulières (la liste suivante est incomplète, alors soyez au courant d'autres personnages comme (, {, $ etc.) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


Si vous voulez vous débarrasser de tous les signes de ponctuation et symboles, essayez cette expression régulière: \p{P}\p{S}(gardez à l'esprit que dans les chaînes Java, vous devrez éviter les barres obliques inverses :) "\\p{P}\\p{S}".

Une troisième manière pourrait être quelque chose comme ceci, si vous pouvez définir exactement ce qui doit rester dans votre chaîne:

String  result = yourString.replaceAll("[^\\w\\s]","");

Cela signifie: remplacez tout ce qui n'est pas un caractère de mot (az dans tous les cas, 0-9 ou _) ou des espaces.

Edit: veuillez noter qu'il existe quelques autres modèles qui pourraient s'avérer utiles. Cependant, je ne peux pas tous les expliquer, alors jetez un œil à la section de référence de regular-expressions.info .

Voici une alternative moins restrictive à l'approche «définir les caractères autorisés», comme suggéré par Ray:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

Le regex correspond à tout ce qui n'est pas une lettre dans aucune langue et pas un séparateur (espace, saut de ligne, etc.). Notez que vous ne pouvez pas utiliser [\P{L}\P{Z}](P majuscule signifie ne pas avoir cette propriété), car cela signifierait «tout ce qui n'est pas une lettre ou pas un espace», ce qui correspond presque à tout, puisque les lettres ne sont pas des espaces et vice versa.

Informations supplémentaires sur Unicode

Certains caractères Unicode semblent poser des problèmes en raison de différentes manières possibles de les coder (comme un point de code unique ou une combinaison de points de code). Veuillez consulter regular-expressions.info pour plus d'informations.


+1 pour la meilleure solution polyvalente. Puisque vous énumérez quelques variations en l'absence de détails de l'OP, vous pourriez aussi bien montrer et expliquer des modèles tels que[\P{L}]
Ray Toal

Notez également que le -caractère doit être le premier ou le dernier de la liste ou il doit être échappé.
kapex le

[^\\p{L}\\p{Z}]semble également éliminer les trémas allemands (ä, ö, ü) (du moins pour moi: /), donc "La regex correspond à tout ce qui n'est une lettre dans aucune langue" ne semble pas être 100% correct
Peter

@Peter ça n'élimine pas ces caractères dans mes tests. Il peut y avoir un autre problème dans votre cas, par exemple un encodage différent du texte. Je vais ajouter un lien vers plus d'informations.
Thomas

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");fait une erreurInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

Comme décrit ici http://developer.android.com/reference/java/util/regex/Pattern.html

Les modèles sont des expressions régulières compilées. Dans de nombreux cas, des méthodes pratiques telles que String.matches, String.replaceAllet String.splitseront préférables, mais si vous avez besoin de travailler beaucoup avec la même expression régulière, il peut être plus efficace de la compiler une fois et de la réutiliser. La classe Pattern et son compagnon, Matcher, offrent également plus de fonctionnalités que la petite quantité exposée par String.

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

Résultat

String is = one
Number is = 9196390097

Cela supprimera les caractères arabes
S0haib Nasir

15

Essayez la replaceAll()méthode de la Stringclasse.

BTW voici la méthode, le type de retour et les paramètres.

public String replaceAll(String regex,
                         String replacement)

Exemple:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

Il devrait supprimer tous les caractères {'^', '+', '-'} que vous vouliez supprimer!


6

Pour supprimer un caractère spécial

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

La sortie sera: abdd.

Cela fonctionne parfaitement.


1
obtiendra un caractère d'échappement illégal dans la chaîne littérale
John Joe

Cela supprimera également les espaces si vous souhaitez conserver les espaces, puis utilisez t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan

2

Utilisez la String.replaceAll()méthode en Java. replaceAll devrait être assez bon pour votre problème.


1

Vous pouvez supprimer un seul caractère comme suit:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

PRODUCTION:

919595354336

0

Si vous voulez juste faire un remplacement littéral en java, utilisez Pattern.quote(string)pour échapper n'importe quelle chaîne à un littéral.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.