proszę, jaka jest różnica między tymi wyrażeniamiRegex wyrażeń w Java \ s vs. \ s +
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
proszę, jaka jest różnica między tymi wyrażeniamiRegex wyrażeń w Java \ s vs. \ s +
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
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
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. ;) –
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
Złap słowo "niechętnie". To pytanie dotyczy '\ s +', a nie '\ s +?' Jak to inne pytanie. –
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.
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
@ 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
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+", "");
kwantyfikatorów przeczytać na nich. – jn1kk