2014-11-22 2 views
3

<으로 둘러싸인 mapDir을 특정 문자열로 대체하려면 어떻게해야합니까?문자열 인덱스가 모두 바뀌며 범위를 벗어남

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\"; 
    String test = "foo: <mapDir> -bar"; 
    println(test.replaceAll("<mapDir>", mapDir)); 

위의 내용은 StringIndexOutOfBoundsException을 제공합니다.

나를 위해 아래의이 코드는,하지만 난 순수 자바뿐만 아니라 작동 생각합니다.

static String replaceWord(String original, String find, String replacement) { 
    int i = original.indexOf(find); 
    if (i < 0) { 
     return original; // return original if 'find' is not in it. 
    } 

    String partBefore = original.substring(0, i); 
    String partAfter = original.substring(i + find.length()); 

    return partBefore + replacement + partAfter; 
} 
+0

을, 그것은 정규식이므로. –

+0

이 게시물을 확인하십시오. http://stackoverflow.com/questions/18875852/why-string-replaceall-in-java-requires-4-slashes-in-regex-to-actually-r/ – gashu

답변

4

정규식을 사용하지 않으므로 replaceAll 메서드가 필요하지 않습니다. 대신 당신이 replace API를 아래 등으로 일할 수 : 정규식

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\"; 
String test = "foo: <mapDir> -bar"; 
System.out.println(test.replace("<mapDir>", mapDir)); 
+0

정확 하 게. 'replaceAll'에있는'all'은 검색된 문자열의 모든 발생을 대체한다는 것을 의미하는 것은 아니며,'replace'는 첫 번째 문자열 만 대체합니다. 둘 다 * 모든 사건을 대체합니다. – Tom

+0

감사합니다. 그들이 선택한 혼란스러운 이름의 비트 :) – clankill3r

0

replaceAll 이후 작품을, 당신은 백 슬래시를 다시 탈출해야합니다

:

String mapDir = "D:\\\\mapping\\\\specialists\\\\ts_gpc\\\\"; 
String test = "foo: <mapDir> -bar"; 
System.out.println(test.replaceAll("<mapDir>", mapDir)); 


this 대답을 인용

정규식 컴파일러가 지정한 패턴을 볼 때까지 은 단일 백 슬래시 (자바의 렉서)는 하나 하나에 이중 backwhack을 설정 한 이후 documentation에 지정된 String에서

3

replaceAll는 정규식을 사용

주 백 슬래시()와 달러 기호 ($이) 대체 문자열에서 결과가 리터럴 대체 문자열로 취급되는 경우와 다를 수 있습니다. Matcher.replaceAll을 참조하십시오. 원하는 경우 Matcher.quoteReplacement (java.lang.String)를 사용하여 이러한 문자의 특수한 의미를 숨 깁니다.

따라서, 당신은 다음과 같이 교체 문자열을 탈출해야합니다 : 출력 제공

String mapDir = "D:\\mapping\\specialists\\ts_gpc\\"; 
String test = "foo: <mapDir> -bar"; 
System.out.println(test.replaceAll("<mapDir>", Matcher.quoteReplacement(mapDir))); 

: 당신은 완전히 대체하기의 첫 번째 인수를 (Pattern.quote)을 인용 할 필요가

foo: D:\mapping\specialists\ts_gpc\ -bar 
관련 문제