2013-03-25 17 views

Odpowiedz

55

Pierwsze mecze pojedyncze spacje, natomiast druga odpowiada jeden lub wiele spacje. Są tak zwane zwykłe kwantyfikatory ekspresyjnych i wykonują mecze jak ten (wzięte z documentation):

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 
+8

Zawsze uwielbiałem, w jaki sposób dostarczają one oddzielne opisy chciwych, niechętnych i zaborczych wersji każdego kwantyfikatora, a następnie mówią dokładnie to samo o wszystkich trzech. ;) –

2

Pierwszy regex będą pasować jeden biały znak. Drugie wyrażenie będzie niechętnie pasowało do jednego lub więcej znaków białych znaków. W większości przypadków te dwa wyrażenia regularne są bardzo podobne, z wyjątkiem drugiego przypadku, wyrażenie regularne może dopasować więcej ciągu znaków, jeśli uniemożliwi dopasowanie wyrażenia regularnego. od http://www.coderanch.com/t/570917/java/java/regex-difference

+0

Złap słowo "niechętnie". To pytanie dotyczy '\ s +', a nie '\ s +?' Jak to inne pytanie. –

30

Te dwie rozmowy replaceAll zawsze będą dawać taki sam wynik, niezależnie od tego, co jest x. Jednak ważne jest, aby pamiętać, że te dwa wyrażenia regularne nie są takie same:

  • \\s - dopasowuje pojedynczy biały znak
  • \\s+ - odpowiada sekwencji jednego lub więcej znaków spacji.

W tym przypadku nie ma znaczenia, ponieważ zastępujesz wszystko pustym łańcuchem (chociaż lepiej byłoby użyć \\s+ z punktu widzenia wydajności). Jeśli zastępowałeś niepustym łańcuchem, te dwa zachowania zachowują się inaczej.

+0

W.r.t twoja pierwsza linia, Jeśli x to "Zarezerwuj domenę i Get \ n \ n \ n \ n \ n \ n Online dzisiaj." Czy oba będą dawały takie same wyniki? – user3705478

+2

@ user3705478 Obie będą dawać takie same wyniki, nawet jeśli po sobie będzie wiele spacji. Różnica polega na sposobie w jaki jest obsługiwany. Gdybyś miał grupę (na przykład) 3 spacji bezpośrednio po sobie nawzajem \\ s + zabiera tę grupę i zamienia ją w "", a \\ s przetwarzałoby każdą przestrzeń samodzielnie. – Daemun

7

Przede wszystkim należy zrozumieć, że końcowe wyniki obu instrukcji będą takie same, to jest usunięcie wszystkich spacji z danego ciągu znaków.

Jednak bardziej efektywny sposób przycinania spacji (jeśli ciąg może zawierać wiele sąsiadujących spacji) z powodu potencjalnie mniejszej ilości zamienników, ponieważ regex \\s+ dopasowuje 1 lub więcej spacji jednocześnie i zastępuje je pustym ciągiem .

Więc nawet jeśli masz taką samą moc zarówno lepiej jest użyć:

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