Нека направим обиколка на 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
"You are 'awesome'\'amazing'"
, в момента ще получите"You are \'awesome\'\\'amazing\'"
. Това оставя третия цитат неекраниран, защото тази въведена от потребителя обратна наклонена черта избягва генерираната обратна наклонена черта след нея! - person tobii   schedule 21.12.2013