RegEx olmadan String.replaceAll


116

Bir dizedeki bir alt dizenin tüm örneklerini değiştirmek istiyorum, ancak String.replaceAll()yalnızca bir kalıbı kabul ediyor. Önceki bir maçtan geldiğim dizi. Sahip olduğum kalıba kaçışlar eklemek mümkün mü veya replaceAll()başka bir sınıfta bir kalıp yerine değişmez bir dizeyi kabul eden bir sürümü var mı?


Yanıtlar:


189

Sadece String.replace(CharSequence,CharSequence)yerine kullanın replaceAll.


13
Bu sadece ilkinin yerini almaz mı? Garip, "replaceRegex" yerine "replaceAll" demişlerdi.
Magic Octopus Urn

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));döner "hi world, hi life, hi you".
Thiago Mata

14
@MagicOctopusUrn: Evet, isimlendirmenin çok zayıf olduğuna katılıyorum - zamanla çok fazla kafa karışıklığına neden oldu.
Jon Skeet

yöntemlerin çok kötü adlandırılması. Neden basit şeyleri karmaşık hale getiriyorlar (güneş / kehanet)
Stunner

94

Kaçış ekleme yöntemi Pattern.quote().

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

Ama Jon'un dediği gibi sadece kullanabilirsin replace(). İsminden sapmasına rağmen tıpkı olduğu gibi tüm oluşumların replaceAllyerini alıyor .replaceAll()


Örneğin, eşleşenStr'nizde bir "$" varsa mükemmel çalışır.
Julien Lafont

daha ziyade Pattern.compile (); Pattern.quote () istenmeyen sonuçlar getiriyor
Pavlo Zvarych

@PavloZvarych: Pattern.compile()dizeyi normal bir ifade olarak derler, yani özel karakterlere özel anlam verilecektir. Bu Pattern.quote(), yaptığının ve OP'nin istediği şeyin tam tersidir ( quote()"dizgeyi değişmez olarak ele alın" der). Belki de bahsettiğiniz "istenmeyen sonuçların" ne olduğunu genişletebilirsiniz.
Mark Peters

@MarkPeters "$ 1" için \\ G1 \\ G gibi bir şeydi
Pavlo Zvarych

1
@PavloZvarych: Değiştirmeyi (arama modelini değil) alıntılamaya çalışıyorsanız, kullanmak istersiniz Matcher.quoteReplacement("$aa +"). Pattern.compile()a Patterndeğil, üretir String, bu yüzden onu nasıl kullandığınızı bile bilmiyorum replaceAll.
Mark Peters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.