Java'da normal ifade ifadeleri, \\ s ve \\ s +


97

Aşağıdaki iki ifade arasındaki fark nedir?

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");

Yanıtlar:


89

İ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

21
Her niceleyicinin açgözlü, isteksiz ve sahiplenici versiyonlarının ayrı tanımlarını vermelerini ve ardından üçü için de tamamen aynı şeyi söylemelerini her zaman sevmişimdir. ;)
Alan Moore

60

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ı.


İlk satırınızı yazın, eğer x "Etki Alanınızı Ayırtın ve \ n \ n \ n \ n \ n \ n Bugün Çevrimiçi Olun." İkisi de aynı sonuçları üretecek mi?
sofs1

3
@ user3705478 Birbirinden sonra birden fazla boşluk olsa bile her ikisi de aynı sonuçları üretecektir. Aradaki fark, ele alınma biçiminde yatıyor. Birbirini takip eden (örneğin) 3 boşluktan oluşan bir grubunuz varsa, \\ s + bu grubu alır ve bütününü bir "" haline getirir, \\ s ise her alanı kendi başına işler.
Dennie

11

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+", "");

2

İ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


"İsteksizce" kelimesini kaşı. Bu soru, diğer soru ile ilgili \s+değil \s+?.
Alan Moore
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.