Jaka jest różnica między następującymi dwoma wyrażeniami?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
java
regex
string
quantifiers
mpluse
źródło
źródło
Te dwa
replaceAll
wywołania zawsze dadzą ten sam wynik, niezależnie od tego, cox
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.źródło
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+", "");
źródło
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
źródło
\s+
, a nie\s+?
innego pytania.