Vraag Java: alles vervangen 'in een string met \'


Ik moet aan alle aanhalingstekens (') in een string ontsnappen, dus het wordt \'

Ik heb geprobeerd ReplaceAll te gebruiken, maar het doet niets. Om de een of andere reden kan ik de regex niet laten werken.

Ik probeer het met

String s = "You'll be totally awesome, I'm really terrible";
String shouldBecome = "You\'ll be totally awesome, I\'m really terrible";
s = s.replaceAll("'","\\'"); // Doesn't do anything
s = s.replaceAll("\'","\\'"); // Doesn't do anything
s = s.replaceAll("\\'","\\'"); // Doesn't do anything

Ik zit hier echt vast, ik hoop dat iemand me hier kan helpen.

Bedankt,

Iwan


19
2017-12-12 23:05


oorsprong


antwoorden:


Je moet eerst aan de backslash ontsnappen omdat het een letterlijke (opbrengst) is \\), en dan weer ontsnappen vanwege de reguliere expressie (toegeven) \\\\). Dus probeer:

 s.replaceAll("'", "\\\\'");

output:

You\'ll be totally awesome, I\'m really terrible

27
2017-12-12 23:07



Gebruik vervangen()

 s = s.replace("'", "\\'"); 

output:

Je zult helemaal geweldig zijn, ik ben echt verschrikkelijk


12
2017-12-12 23:08



Laten we een rondleiding volgen String # repalceAll (String regex, String replacement) 

Je zult zien dat:

Een aanroep van deze methode van de vorm str.replaceAll (regex, repl) levert exact hetzelfde resultaat op als de expressie

Pattern.compile(regex).matcher(str).replaceAll(repl)

Dus laten we eens kijken Matcher.html # replaceAll (java.lang.String) documentatie

Houd er rekening mee dat backslashes (\) en dollartekens ($) in de vervangende tekenreeks kan ertoe leiden dat de resultaten anders zijn dan wanneer het zou worden behandeld als een letterlijke vervangende tekenreeks. Dollartekens kunnen worden behandeld als verwijzingen naar ingevangen deelsequenties zoals hierboven beschreven, en backslashes worden gebruikt om te ontsnappen aan letterlijke tekens in de vervangende tekenreeks.

Dat zie je in replacement we hebben een speciaal karakter $ welke kan worden gebruikt als referentie naar gevangen groep zoals

System.out.println("aHellob,aWorldb".replaceAll("a(\\w+?)b", "$1"));
// result Hello,World

Maar soms willen we niet $ zo speciaal omdat we het als een eenvoudig dollarteken willen gebruiken, dus we hebben een manier nodig om eraan te ontsnappen.
En hier komt het \omdat het wordt gebruikt om te ontsnappen aan metatekens in regex, Strings en waarschijnlijk op andere plaatsen is het een goede conventie om het hier te gebruiken om te ontsnappen $.

Dus nu \ is ook metacharakter bij het vervangen van een onderdeel, dus als je het eenvoudig wilt maken \ letterlijk vervangend, moet je er op de een of andere manier aan ontsnappen. En raad eens? Je ontsnapt het op dezelfde manier als je eraan ontsnapt in regex of String. Je hoeft alleen maar een andere te plaatsen \ voordat je ontsnapt.

Dus als je wilt creëren \ in het vervangende onderdeel moet je nog een toevoegen \ voor het. Maar onthoud dat om te schrijven \ Letterlijk in String moet je het als schrijven "\\" dus om er twee te maken \\ ter vervanging moet je het als schrijven "\\\\".


Dus probeer

s = s.replaceAll("'", "\\\\'");

of nog beter, om expliciet te ontsnappen in het vervangende onderdeel (en ook in het deel van de regex - vergeten om te vermelden dat eerder) gewoon te gebruiken replace in plaats daarvan replaceAll wat voor ons ontsnapt

s = s.replace("'", "\\'");

8
2017-12-13 00:55



Dit zegt niet hoe het probleem moet worden "opgelost" - dat is al gedaan in andere antwoorden; het bestaat om de details en toepasselijke documentatie-referenties uit te tekenen.


Tijdens gebruik String.replaceAll of een van de toepasselijke Matcher-vervangers, let op de vervangende tekenreeks en hoe deze wordt afgehandeld:

Let daar op backslashes (\) en dollartekens ($) in de vervangende tekenreeks kan ertoe leiden dat de resultaten anders zijn dan wanneer het zou worden behandeld als een letterlijke vervangende tekenreeks.Dollartekens kunnen worden behandeld als verwijzingen naar vastgelegde deelverklaringen zoals hierboven beschreven en backslashes worden gebruikt om te ontsnappen aan letterlijke tekens in de vervangende tekenreeks.

Zoals opgemerkt door isnot2bad in een opmerking, Matcher.quoteReplacement kan hier handig zijn:

Retourneert een letterlijke vervangende tekenreeks voor de opgegeven tekenreeks. .. De geproduceerde string komt overeen met de reeks tekens die als een letterlijke reeks wordt behandeld. Slashes (\) en dollartekens ($) krijgt geen speciale betekenis.


3
2017-12-13 00:47



Je zou ook iets zoals StringEscapeUtils kunnen proberen om je leven nog eenvoudiger te maken: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html

s = StringEscapeUtils.escapeJava(s);

1
2017-12-12 23:09