2014-12-09 8 views
5

Mam ciąg s i wyrażenie regularne. Chciałbym zastąpić każdy mecz z regex w s z ciągiem zastępującym. Zamienny ciąg może zawierać jeden lub więcej odwróconych ukośników. Aby wykonać zastępstwo, używam metody Matcher 's appendReplacement.Metoda appendReplacement Matchera ignoruje ukośniki odwrotne zastępcze

Problem z appendReplacement polega na tym, że ignoruje wszystkie naprężenia występujące w łańcuchu zastępczym. Więc jeśli mogę spróbować wymienić podciąg "match" w ciągu "one match" z ciągiem zastępczym "a\\b", następnie appendReplacement skutkuje "one ab" zamiast "one a\\b" *:

Matcher matcher = Pattern.compile("match").matcher("one match"); 
StringBuffer sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\b"); 
System.out.println(sb); // one ab 

Brałem spojrzeć na appendReplacement „s kodu, i okazało się, że pomija każdy napotkany ukośnik odwrotny:

if (nextChar == '\\') { 
    cursor++ 
    nextChar = replacement.charAt(cursor); 
    ... 
} 

Jak mogę zamienić każdy mecz na zastępczy łańcuch zawierający odwrócone ukośniki?

(*) - Należy zauważyć, że istnieje jeden odwrócony ukośnik w pozycji "a\\b", a nie dwie. Odwrotny ukośnik jest po prostu uciekł.

+0

'" a "+" \ "+" b "' ???????? – vks

+0

@vks: Jeśli pytasz, czy mój przykład zastępczego łańcucha to '" a "+" \ "+" b "', to tak, z tym że '" \ "' jest niedozwolonym ciągiem Java, ponieważ musisz uciec ukośnik wsteczny. – snakile

+0

Właściwie to zapytałem, czy ta zamiana działa: P – vks

Odpowiedz

2

Trzeba podwójnej ucieczki odwrotny ukośnik t j .:

matcher.appendReplacement(sb, "a\\\\b"); 

Pełny Kod:

Matcher matcher = Pattern.compile("match").matcher("one match"); 
sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\\\b"); 
System.out.println(sb); //-> one a/b 

Powód jest, że Java umożliwia korzystanie z odwołania wstecznego jak $1, $2 etc w łańcuchu zastępczym i że wymusza sam mechanizm odwrotnego ukośnika ucieczki jak w głównym regex.

2

Musisz uciec ucieczek

Matcher matcher = Pattern.compile("match").matcher("one match"); 
StringBuffer sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\\\b"); 
System.out.println(sb); 

Alternatywnie można użyć replace()

String test="one match"; 
test=test.replace("match", "a\\b"); 
System.out.println(test); 

wyjściowa:

one a\b 
+0

Po prostu fyi, oryginalna odpowiedź miała tylko kod 'replace' ale teraz' matcher.appendReplacement (sb, "a \\\\ b"); 'pojawił się również po mojej odpowiedzi – anubhava

+0

Co jest z tym nie tak? –

Powiązane problemy