Jaka jest różnica między następującymi dwoma wyrażeniami?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
Odpowiedzi:
Pierwsza z nich dopasowuje pojedynczą białą spację, a druga jedną lub wiele białych znaków. Są to tak zwane kwantyfikatory wyrażeń regularnych i wykonują takie dopasowania (zaczerpnięte z dokumentacji ):
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
Te dwa replaceAll
wywołania zawsze dadzą ten sam wynik, niezależnie od tego, co x
się stanie. Należy jednak pamiętać, że te dwa wyrażenia regularne nie są takie same:
\\s
- dopasowuje pojedynczy biały znak \\s+
- dopasowuje sekwencję jednego lub więcej białych znaków.W tym przypadku nie ma to znaczenia, ponieważ zastępujesz wszystko pustym ciągiem (chociaż \\s+
z punktu widzenia wydajności byłoby to lepsze ). Gdybyś zastąpił niepustym łańcuchem, oba zachowywałyby się inaczej.
Przede wszystkim musisz zrozumieć, że ostateczne wyjście obu instrukcji będzie takie samo, tj. Usunięcie wszystkich spacji z podanego ciągu.
Jednak x.replaceAll("\\s+", "");
będzie bardziej efektywny sposób przycinania spacji (jeśli ciąg może mieć wiele ciągłych spacji) z powodu potencjalnie mniejszej liczby zamienników ze względu na fakt, że wyrażenie regularne\\s+
dopasowuje 1 lub więcej spacji jednocześnie i zastępuje je pustym ciągiem.
Więc nawet jeśli otrzymujesz ten sam wynik z obu, lepiej jest użyć:
x.replaceAll("\\s+", "");
Pierwsze wyrażenie regularne dopasuje jeden biały znak. Drugi regex niechętnie dopasuje jeden lub więcej białych znaków. W większości przypadków te dwa wyrażenia regularne są bardzo podobne, z wyjątkiem drugiego przypadku, że wyrażenie regularne może dopasować większą część ciągu, jeśli zapobiega niepowodzeniu dopasowania wyrażenia regularnego. z http://www.coderanch.com/t/570917/java/java/regex-difference
\s+
, a nie \s+?
innego pytania.