7
votes

Remplacer le caractère spécial par un caractère spécial évasé précédé de Java

Dans mon code Java, si une chaîne d'entrée a obtenu l'un des caractères spéciaux mentionnés, il doit être précédé d'être précédé par \\

jeu de caractères spécial est {+, -, &&, ||,!, (,), {,}, [], ^, "", ~, *,?, :, \} . J'ai essayé d'utiliser string.replaceall (ancien, nouveau) mais à ma surprise, ce n'est pas opérationnel, même si je donne des valeurs appropriées pour "vieux" et "nouveau". xxx

I Mettez les caractères spéciaux dans une matrice de chaîne, itéré dans A pour boucle, vérifié s'il est présent dans la chaîne, si oui, INPUT.RREPLACEALL (":" ":" : ") . Mais ça ne me donnait pas la sortie souhaitée. S'il vous plaît aider xxx


0 commentaires

4 Réponses :


3
votes

string #. / code> prend un regex comme premier paramètre. Donc, votre code échouera si l'entrée de la chaîne est un méta-caractère similaire - + .

Vous devez utiliser string # # remplacer .

et aussi vous n'avez pas besoin de la dernière affectation: - xxx

comme, vous n'utilisez pas du tout. Vous êtes en fait attribuant la chaîne modifiée Retour à la recherche , donc ce n'est pas nécessaire.

aussi, plutôt que d'utiliser nouvelle chaîne (...) , pour construire votre nouvelle chaîne. En fait, vous avez juste besoin d'une seule ligne dans votre if-énoncé .

OK maintenant, après cette explication , vous pouvez maintenant utiliser ci-dessous < Code> for-boucle : - xxx


2 commentaires

Merci rohit. Et l'inverse d'utiliser Remplacer au lieu de remplacer, je dois boucler sur ma chaîne d'entrée, ce qui rend la boucle extérieure et celle-ci la boucle interne droite. Je pensais éviter de itération de la chaîne d'entrée (en pensant aux cas lorsque la longueur de la chaîne d'entrée devient grande!). Il y a aussi des symboles qui ne peuvent pas être échappés avec un seul '\' à droite ... comme pour \ elle-même, nous devons vous échapper comme '\\\\' juste?


@Rohit, je reçois de l'aide de votre part de plus de 4 ans, merci d'avoir été actif!



13
votes

Une fois que vous avez réalisé que le remplacement prend une regex, c'est juste une question de codage de vos caractères comme une regex.

Essayez ceci: p>

code\:xy


10 commentaires

Vous devez également échapper au [.


@Rohitjain non, vous n'avez pas besoin d'échapper au [. Essayer


@Bohemian .. l'a essayé, c'est pourquoi j'ai posté le commentaire. Ça ne fonctionne pas.


@Rohitjain je veux voir cela pour moi-même! Je ne peux pas vérifier maintenant (à l'aide de l'iPhone) mais je vérifierai dès que possible. J'étais sûr que tu ne l'as pas fait, mais je continue d'apprendre des choses ici


@Rohitjain merci Bohemian et Rohit. Lorsque j'ai utilisé cela, cela a donné une exception de classe de caractères non récapitule, alors [doit être échappé non? Également si l'un quelconque du symbole est présent dans ma chaîne qui doit être remplacée par une évasion suivie de ce symbole lui-même, comment atteindre ce modèle. ? Comment obtenir cette valeur de groupe à être annexée avec "\\" en Java. J'ai essayé une entrée comme A * B, mais elle a échoué. Je vais le vérifier à nouveau et vous le ferai savoir


Lorsque j'ai essayé pour un code de chaîne d'entrée: XY Il a échoué à donner stressindexoutofboundsException à String Newsecearch = Search.ReplaceAll ("(? = [- + & |! () ^ \\\] ) "," \\ "); java.lang.stringindexoutofboundsException: index de chaîne hors de portée: 1 à java.lang.string.chardat (string.java:686) à java.util.regex.matcher.AppendReplacement (correspondeur. java: 703) à java.util.regex.matcher.replaceall (correspondeur.java:813) à java.lang.string.replaceall (string.java:2189)


Motif p = motif.comPILE ("(. *) (? = [- + & |! () {} \ [\] ^ \\" ~ *?: \\\\ & # 93;) " ); Matcher M = P.Matcher (Recherche); String S0 = M.Group (0); String S1 = M.Group (1); Chaîne S2 = M.Group (2); MAINTENANT POUR CODE: XY, S0 = Code: xy, s1 = code et s2 =: xy. Donc, j'ai besoin d'obtenir comme ça et devrait annoncer cela avec \\ lors de l'utilisation de remplailleL ()?


@ user1863118 OK j'ai corrigé le problème. Il m'a fallu un certain temps pour réaliser que je devais doter de double-échapper au remplacement backslash, c'est-à-dire \\\\ voir la réponse modifiée, y compris du code de test pour montrer que c'est Est-ce que travaille en fait :)


Séquence d'échappement non valide dans la chaîne JSON '\:'


@Dean puis essayez de supprimer le côlon : de la regex.



2
votes

Essayez d'utiliser le ci-dessous. Veuillez utiliser la méthode de remplacement au lieu de remplacerAll

Search = Search.replace (Oldstring, Newstring);


0 commentaires

0
votes

Lorsque j'ai essayé le code ci-dessous, il a fonctionné

String[] arr = { "+", "-", "&&", "||", "!", "(", ")", "{", "}",
                    "[", "]", "^", "\"", "~", "*", "?", ":", "\\", "AND", "OR" };

        for (int i = 0; i < arr.length; i++) {
    //'search' is my input string

            if (search.contains((String) arr[i])) {

                String oldString = (String) arr[i];

                String newString = new String("\\" + arr[i]);
                search = search.replaceAll(oldString,(String) ("\\" + newString));



            }
        }


1 commentaires

Essayez cette chaîne - A + B .