Java: Заменете всички ' в низ с \'

Трябва да избягам от всички кавички (') в низ, така че да стане \'

Опитах да използвам replaceAll, но не прави нищо. По някаква причина не мога да накарам регулярния израз да работи.

Опитвам се с

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

Наистина съм заседнал тук, надявам се някой да може да ми помогне тук.

Благодаря,

Иван


person Iwan Eising    schedule 12.12.2013    source източник
comment
възможен дубликат на replace() и replaceAll() в Java   -  person user2864740    schedule 13.12.2013
comment
В случай, че все още не сте обмислили това, ако въвеждането е от потребител по някакъв начин, може да искате първо да замените всички обратни наклонени черти с двойни обратни наклонени черти. Например, ако потребителят въведе "You are 'awesome'\'amazing'", в момента ще получите "You are \'awesome\'\\'amazing\'". Това оставя третия цитат неекраниран, защото тази въведена от потребителя обратна наклонена черта избягва генерираната обратна наклонена черта след нея!   -  person tobii    schedule 21.12.2013


Отговори (6)


Първо трябва да екранирате обратната наклонена черта, защото е литерал (получава \\), а след това отново да го екранирате поради регулярния израз (получавайки \\\\). И така, опитайте:

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

изход:

You\'ll be totally awesome, I\'m really terrible
person Sage    schedule 12.12.2013
comment
Matcher.quoteReplacement(\\') може да се използва за цитиране на заместващия низ. - person isnot2bad; 13.12.2013
comment
@isnot2bad Наистина смятам, че използването на Matcher.quoteReplacement почти само по себе си заслужава отговор. (Това е quoteReplacement, а не quoteRegex по причина.) - person user2864740; 13.12.2013
comment
@user2864740, бихте ли разяснили малко. Обясних го от гледна точка на последователност от символи на функция за замяна, тъй като в този случай няма да имаме нужда от четири обратни наклонени черти, а само две, както Nambari отговори. - person Sage; 13.12.2013
comment
Оплакването ми е от .. заради регулярния израз .., който е грешен. Това е заместващ низ, а не регулярен израз. - person user2864740; 13.12.2013
comment
@user2864740, да, но имах предвид, че за да бъде заменен с този регулярен израз на replaceAll, ще трябва да го екранираме отново - person Sage; 13.12.2013
comment
Регулярният израз се обозначава с низовия литерал "'". Методът не е регулярен израз, но използва регулярен израз. - person user2864740; 13.12.2013
comment
Можете ли да ми кажете какво да направя, ако трябва да заменя " с \"? - person Girdhari Agrawal; 11.08.2016
comment
това не работи, моля, предложете друг метод - person Dinesh Pathak DK; 23.10.2018

Използвайте replace()

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

изход:

Ще бъдеш наистина страхотен, аз съм наистина ужасен

person kosa    schedule 12.12.2013
comment
@BoristheSpider: replaceall() е различно от replace(). Не мисля, че OP се нуждае от регулярен израз тук. - person kosa; 13.12.2013
comment
това не работи, моля, предложете друг метод - person Dinesh Pathak DK; 23.10.2018

Нека направим обиколка на String#repalceAll(регулярен израз на низ, заместване на низ)

Ще видите, че:

Извикването на този метод във формата str.replaceAll(regex, repl) дава точно същия резултат като израза

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

Така че нека да разгледаме Matcher.html#replaceAll(java.lang.String) документация

Имайте предвид, че обратните наклонени черти (\) и знаците за долар ($) в заместващия низ може да доведат до различни резултати от тези, ако се третира като литерал заместващ низ. Знаците за долар могат да се третират като препратки към уловени подпоследователности, както е описано по-горе, а обратните наклонени черти се използват за избягване на буквални знаци в заместващия низ.

Можете да видите, че в replacement имаме специален знак $, който може да се използва като препратка към заснета група като

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

Но понякога не искаме $ да е толкова специален, защото искаме да го използваме като прост знак за долар, така че имаме нужда от начин да го екранираме.
И тук идва \, тъй като той се използва за екраниране на метазнаци в регулярен израз , низове и вероятно на други места е добра конвенция да го използвате тук, за да избегнете $.

Така че сега \ също е метасимвол в заместващата част, така че ако искате да го направите прост \ литерал в заместването, трябва да го екранирате по някакъв начин. И познай какво? Можете да го екранирате по същия начин, както го екранирате в regex или String. Просто трябва да поставите друг \ преди този, който избягвате.

Така че, ако искате да създадете \ в заместваща част, трябва да добавите друг \ преди него. Но не забравяйте, че за да напишете \ литерал в String, трябва да го напишете като "\\", така че за да създадете две \\ в замяна, трябва да го напишете като "\\\\".


Така че опитайте

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

Или още по-добре

за да намалите изричното екраниране в заместващата част (а също и в частта с регулярен израз - забравих да спомена по-рано), просто използвайте replace вместо replaceAll, което добавя екраниране на регулярен израз вместо нас

s = s.replace("'", "\\'");
person Pshemo    schedule 13.12.2013

Това не казва как да "поправите" проблема - това вече е направено в други отговори; съществува, за да извлече подробностите и приложимите препратки към документацията.


Когато използвате String.replaceAll или някой от приложимите заместители на Matcher, обърнете внимание на низа за заместване и как се обработва:

Имайте предвид, че обратните наклонени черти (\) и знаците за долар ($) в заместващия низ може да доведат до различни резултати от тези, ако се третират като буквален заместващ низ. Знаците за долар може да се третират като препратки към уловени подпоследователности, както е описано по-горе, и обратните наклонени черти се използват за екраниране на литерални знаци в заместващия низ.

Както беше посочено от isnot2bad в коментар, Matcher.quoteReplacement може да бъде полезно тук:

Връща литерал заместващ низ за посочения низ. .. Произведеният низ ще съответства на последователността от знаци в s, третирана като буквална последователност. Наклонените черти (\) и знаците за долар ($) няма да имат специално значение.

person user2864740    schedule 13.12.2013

Можете също да опитате да използвате нещо като StringEscapeUtils, за да направите живота си още по-лесен: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html

s = StringEscapeUtils.escapeJava(s);
person LeoPleurodon    schedule 12.12.2013

Можете да използвате библиотеката commons-text на apache (вместо commons-lang):

Примерен код:

org.apache.commons.text.StringEscapeUtils.escapeJava(escapedString);

Зависимост:

compile 'org.apache.commons:commons-text:1.8'

OR

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-text</artifactId>
   <version>1.8</version>
</dependency>
person Bogdan Kobylynskyi    schedule 08.04.2020