RegEx가없는 String.replaceAll


115

문자열에서 하위 문자열의 모든 인스턴스를 바꾸고 싶지만 String.replaceAll()패턴 만 허용합니다. 이전 경기에서 가져온 문자열입니다. 내가 가지고있는 패턴에 이스케이프를 추가 할 수 replaceAll()있습니까? 아니면 패턴 대신 리터럴 문자열을 받아들이는 다른 클래스 의 버전이 있습니까?


답변:


189

String.replace(CharSequence,CharSequence)대신 사용하십시오 replaceAll.


13
이것은 단지 첫 번째를 대체하지 않습니까? 이상하게도 그들은 "replaceRegex"대신 "replaceAll"이라고 불렀습니다.
Magic Octopus Urn

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));를 반환합니다 "hi world, hi life, hi you".
Thiago Mata

14
@MagicOctopusUrn : 예, 이름이 매우 좋지 않았다는 데 동의합니다. 시간이 지남에 따라 많은 혼란을 야기했습니다.
Jon Skeet

메서드 이름이 매우 잘못되었습니다. 왜 그들이 (sun / oracle) 단순한 일을 복잡하게 만드는가
Stunner

93

이스케이프를 추가하는 방법은 Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

그러나 Jon이 말했듯이 replace(). 그것은에서 벗어나 있다는 사실에도 불구하고 replaceAll이름, 그것은 대체하지 않습니다 모든 단지 등의 발생을 replaceAll().


예를 들어 matchingStr에 "$"가 있으면 완벽하게 작동합니다.
Julien Lafont 2015

오히려 Pattern.compile (); Pattern.quote ()는 바람직하지 않은 결과를 제공합니다
파블로 Zvarych에게

@PavloZvarych : Pattern.compile()문자열을 정규식으로 컴파일합니다. 즉, 특수 문자에 특별한 의미가 부여됩니다. 이것은 Pattern.quote()무엇을 하는가와 OP가 요구하는 것과는 완전히 반대입니다 ( quote()"문자열을 리터럴로 취급"). 당신이 말하는 "바람직하지 않은 결과"에 대해 확장 할 수있을 것입니다.
Mark Peters

@MarkPeters 그것은 "$ 1"에 대한 \\ G1 \\ G와 같은 것이었다
파블로 Zvarych

1
@PavloZvarych : 검색 패턴이 아닌 대체를 인용하려는 경우 Matcher.quoteReplacement("$aa +"). Pattern.compile()을 생성 Pattern하지 않고을 생성 String하므로에서 사용하는 방법이 명확하지 않습니다 replaceAll.
Mark Peters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.