Aşağıdaki iki ifade arasındaki fark nedir?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Yanıtlar:
İlki tek bir beyaz boşlukla eşleşirken, ikincisi bir veya daha fazla boşlukla eşleşir. Normal ifade niceleyicileridir ve şu şekilde eşleşmeler yaparlar ( belgelerden alınmıştır ):
Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times
Bu iki replaceAll
çağrı, ne olduğuna bakılmaksızın her zaman aynı sonucu verecektir x
. Ancak, iki normal ifadenin aynı olmadığına dikkat etmek önemlidir:
\\s
- tek boşluk karakteriyle eşleşir \\s+
- bir veya daha fazla boşluk karakteri dizisiyle eşleşir.Bu durumda, her şeyi boş bir dizeyle değiştirdiğiniz için ( \\s+
verimlilik açısından kullanmak daha iyi olsa da) hiçbir fark yaratmaz . Boş olmayan bir dizeyle değiştirirseniz, ikisi farklı davranırdı.
Her şeyden önce, her iki ifadenin de son çıktısının aynı olacağını, yani verilen dizedeki tüm boşlukların kaldırılacağını anlamanız gerekir.
Bununla birlikte x.replaceAll("\\s+", "");
, normal ifadenin \\s+
aynı anda 1 veya daha fazla boşlukla eşleştiği ve bunları boş dizeyle değiştirdiği gerçeğinden dolayı, potansiyel olarak daha az değiştirme yapılmaması nedeniyle boşlukları kırpmanın (dizenin birden fazla bitişik boşluğu varsa) daha verimli bir yol olacaktır .
Dolayısıyla, her ikisinden de aynı çıktıyı alsanız bile, şunu kullanmak daha iyidir:
x.replaceAll("\\s+", "");
İlk normal ifade, bir boşluk karakteriyle eşleşir. İkinci normal ifade, isteksizce bir veya daha fazla boşluk karakteriyle eşleşir. Çoğu amaç için, bu iki normal ifade çok benzerdir, ancak ikinci durum dışında normal ifade, normal ifade eşleşmesinin başarısız olmasını engellerse dizenin çoğuyla eşleşebilir. dan http://www.coderanch.com/t/570917/java/java/regex-difference
\s+
değil \s+?
.