Відповіді:
Перший відповідає одному пробілу, тоді як другий відповідає одному або кільком пробілам. Вони є так званими кванторами регулярних виразів, і вони виконують подібні збіги (взяті з документації ):
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
Ці два replaceAll
дзвінки завжди дадуть однаковий результат, незалежно від того, що x
є. Однак важливо зазначити, що два регулярні вирази неоднакові:
\\s
- відповідає одному пробілу \\s+
- відповідає послідовності одного або декількох пробілів.У цьому випадку це не має значення, оскільки ви замінюєте все порожнім рядком (хоча було б краще використовувати \\s+
з точки зору ефективності). Якби ви замінювали не пустим рядком, вони поводилися б по-різному.
Перш за все потрібно зрозуміти, що кінцевий результат обох висловлювань буде однаковим, тобто видалити всі пробіли з заданого рядка.
Однак x.replaceAll("\\s+", "");
буде більш ефективним способом обрізання пробілів (якщо рядок може мати кілька суміжних пробілів) через потенційно меншу кількість замін через те, що регулярний вираз \\s+
відповідає 1 або більше пробілам одночасно і замінює їх порожнім рядком.
Отже, навіть якщо ви отримуєте однакові результати з обох, краще використовувати:
x.replaceAll("\\s+", "");
Перший регулярний вираз буде відповідати одному пробілу. Другий регулярний вираз неохоче збігатиметься з одним або кількома пробілами. Для більшості цілей ці два регулярні вирази дуже схожі, за винятком другого випадку, регулярний вираз може збігатися з більшою кількістю рядка, якщо це запобігає відмові збігу регулярних виразів. з http://www.coderanch.com/t/570917/java/java/regex-difference
\s+
, а не \s+?
того іншого питання.