Yanıtlar:
İçinde java.lang.String
, replace
yöntem ya bir çift karakter veya bir çift CharSequence
's alır (bunlardan biri String bir alt sınıftır, bu yüzden mutlu bir şekilde bir String dizisi alır). replace
Yöntem, bir char veya tüm tekrarlarını yerini alacak CharSequence
. Öte yandan, her iki String
bağımsız değişkenleri replaceFirst
ve replaceAll
düzenli ifadeler (regex) bulunmaktadır. Yanlış fonksiyonun kullanılması ince hatalara yol açabilir.
String#replace(target, replacement)
Aynı şeyi yaptığından beri , dizeleri alıntılamak dışında şunu söylemek ilginçtir : Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Neden String#replace
daha hızlı olmasının bir nedeni var mı String#replaceAll
? Sadece String#replace
ek işlemler gerçekleştirdiği için öyle görünmüyor .
replaceAll
. Cevap daha fazlareplace
S: arasındaki fark nedir java.lang.String
yöntemlerle replace()
ve replaceAll()
daha sonraki kullanımları regex bunun dışında.
C: Sadece normal ifade. İkisi de hepsinin yerini alıyor :)
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html
Not:
Ayrıca bir replaceFirst()
(normal ifadeyi alan)
CharSequence
. Her ikisi de replace()
ve replaceAll()
"ile çalışmak CharSequence
". Bu işte replaceAll()
verilen gördüğü CharSequence
o arar böylece normal ifade olarak Normal ifade eşleşirse ederken, replace()
verilen gördüğü CharSequence
o arar böylece düz arama metin olarak geçtiği o.
Hem replace()
ve replaceAll()
dize tüm tekrarlarını değiştirmek.
Farklılıkları anlamak için örnekleri daima yararlı buluyorum.
replace()
Kullan replace()
sadece biraz değiştirmek istiyorsanız char
birbirleriyle char
ya da bazı String
başka ile String
(aslında CharSequence
).
örnek 1
Karakteri tüm tekrarlarını değiştirmek x
ile o
.
String myString = "__x___x___x_x____xx_";
char oldChar = 'x';
char newChar = 'o';
String newString = myString.replace(oldChar, newChar);
// __o___o___o_o____oo_
ÖRNEK 2
Dize tüm oluşumları değiştirin fish
ile sheep
.
String myString = "one fish, two fish, three fish";
String target = "fish";
String replacement = "sheep";
String newString = myString.replace(target, replacement);
// one sheep, two sheep, three sheep
replaceAll()
Kullanım replaceAll()
Bir kullanmak istiyorsanız normal ifade desenini .
ÖRNEK 3
Herhangi bir sayıyı bir ile değiştirin x
.
String myString = "__1_6____3__6_345____0";
String regex = "\\d";
String replacement = "x";
String newString = myString.replaceAll(regex, replacement);
// __x_x____x__x_xxx____x
Örnek 4
Tüm boşlukları kaldırın.
String myString = " Horse Cow\n\n \r Camel \t\t Sheep \n Goat ";
String regex = "\\s";
String replacement = "";
String newString = myString.replaceAll(regex, replacement);
// HorseCowCamelSheepGoat
belgeleme
replace(char oldChar, char newChar)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
replaceFirst(String regex, String replacement)
Düzenli ifadeler
replace()
Yöntem, ilkel hem kabul aşırı char
bir CharSequence
bağımsız değişken olarak.
Performans söz konusu olduğunda, replace()
yöntem biraz daha hızlıdır, replaceAll()
çünkü ikincisi ilk önce normal ifade desenini derler ve daha sonra nihayet değiştirilmeden önce eşleşir, oysa eski basitçe sağlanan argümanla eşleşir ve değiştirir.
O zaman tercih regex desen eşleştirme dolayısıyla daha yavaş biraz daha karmaşık ve olduğunu bildiğimiz için replace()
üzerinde replaceAll()
mümkün olduğunca ileri sürülmektedir.
Örneğin, bahsettiğiniz gibi basit ikameler için kullanmak daha iyidir:
replace('.', '\\');
onun yerine:
replaceAll("\\.", "\\\\");
Not: Yukarıdaki dönüşüm yöntemi bağımsız değişkenleri sisteme bağlıdır.
Pattern.compile(...)
uygulamalarındaki içerik / bölüm görünür replace
, ilk argümanın nasıl tanımlanacağı / gönderileceği konusunda daha az karmaşık görünüyor . Gerektirmez "\"
. Ayrıca replace
Java beri 1.5
ve replaceAll
beri kullanılabilir1.4
String replace(char oldChar, char newChar)
Bu dizedeki tüm oldChar örneklerini newChar ile değiştirerek oluşan yeni bir dize döndürür.
String replaceAll(String regex, String replacement
Bu dizenin verilen normal ifadeyle eşleşen her bir alt dizesini verilen değiştirmeyle değiştirir.
Replace () öğesinin replaceAll () yönteminden daha hızlı çalıştığı doğru değildir, çünkü her ikisi de uygulamasında aynı kodu kullanır
Pattern.compile (normal ifade) .matcher (bu) .ReplaceAll (değiştirme);
Şimdi soru, replace ne zaman kullanılacağı ve replaceAll () ne zaman kullanılacağıdır. Bir alt dizeyi dizede meydana geldiği yerden bağımsız olarak başka bir alt dize ile değiştirmek istediğinizde replace () kullanın. Ancak, yalnızca bir dizenin başında veya sonunda bulunan alt dizeleri değiştirmek gibi belirli bir tercih veya koşulunuz varsa replaceAll () öğesini kullanın. Demek istediğimi kanıtlamak için bazı örnekler:
String str = new String("==qwerty==").replaceAll("^==", "?"); \\str: "?qwerty=="
String str = new String("==qwerty==").replaceAll("==$", "?"); \\str: "==qwerty?"
String str = new String("===qwerty==").replaceAll("(=)+", "?"); \\str: "?qwerty?"
replace
çağırmaz Pattern.compile(regex).matcher(this).replaceAll(replacement);
. Bu çağrılarPattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
Kötü cevabın cevabında belirtildiği gibi, replaceAll ile değiştirme dizesi, replace ve replaceAll arasında farklı işlenir. [3] ve [4] 'ün aynı değere sahip olmasını bekledim, ancak bunlar farklı.
public static void main(String[] args) {
String[] a = new String[5];
a[0] = "\\";
a[1] = "X";
a[2] = a[0] + a[1];
a[3] = a[1].replaceAll("X", a[0] + "X");
a[4] = a[1].replace("X", a[0] + "X");
for (String s : a) {
System.out.println(s + "\t" + s.length());
}
}
Bunun çıktısı:
\ 1
X 1
\X 2
X 1
\X 2
Bu, değiştirme işleminin fazladan kaçma gerektirmediği perl'den farklıdır:
#!/bin/perl
$esc = "\\";
$s = "X";
$s =~ s/X/${esc}X/;
print "$s " . length($s) . "\n";
yazdırılan \ X 2
ReplaceAll () ile java.sql.DatabaseMetaData.getSearchStringEscape () tarafından döndürülen değeri kullanmaya çalışırken, bu oldukça sıkıntı verici olabilir.
Eski iş parçacığı biliyorum ama Java için biraz yeni ve garip şeylerden birini keşfetmek. Kullandım String.replaceAll()
ama öngörülemeyen sonuçlar elde ettim .
Böyle bir şey dizeyi berbat:
sUrl = sUrl.replaceAll( "./", "//").replaceAll( "//", "/");
Bu fonksiyonu garip problemi çözmek için tasarladım:
//String.replaceAll does not work OK, that's why this function is here
public String strReplace( String s1, String s2, String s )
{
if((( s == null ) || (s.length() == 0 )) || (( s1 == null ) || (s1.length() == 0 )))
{ return s; }
while( (s != null) && (s.indexOf( s1 ) >= 0) )
{ s = s.replace( s1, s2 ); }
return s;
}
Yapabilmenizi sağlayan:
sUrl=this.strReplace("./", "//", sUrl );
sUrl=this.strReplace( "//", "/", sUrl );
String.replaceAll()
değişmez argümanlar değil normal ifadeler bekler , bu yüzden "tahmin edilemez" (gerçekten çok tahmin edilebilir) sonuçlar elde edersiniz. String.replace()
istediğiniz gibi çalışır.
Zaten seçili olan "En İyi Cevap" a (ve Suragch'ınki kadar iyi olanlara) eklemek String.replace()
, sıralı karakterlerin (böylece alarak CharSequence
) değiştirilmesiyle sınırlıdır . Ancak, String.replaceAll()
yalnızca sıralı karakterlerin değiştirilmesi ile kısıtlanmaz. Normal ifadeniz bu şekilde oluşturulduğu sürece sıralı olmayan karakterleri de değiştirebilirsiniz.
Ayrıca (en önemlisi ve acıyla bariz), replace()
sadece değişmez değerlerin yerini alabilir; oysa replaceAll
'benzer' sekansların yerini alabilir (mutlaka aynı değildir).
replace()
yöntem normal ifade kalıbı replaceAll()
kullanmazken yöntem normal ifade kalıbı kullanır. Böylece replace()
daha hızlı çalışır replaceAll()
.
replace, char veri türünde çalışır ancak replaceAll, String veri türü üzerinde çalışır ve her ikisi de, ilk bağımsız değişkenin tüm örneklerini ikinci bağımsız değişkenle değiştirir.
str.replaceAll(regex, repl)
aynıdırPattern.compile(regex).matcher(str).replaceAll(repl)
. Yani ne kadar kullanıldığına bağlı olarak büyük bir ek yük var.