Подтвердить что ты не робот

Выражения регулярных выражений в Java\\s vs.\\s +

Пожалуйста, какая разница между этими выражениями

x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
4b9b3361

Ответ 1

Первый соответствует одному пробелу, а второй соответствует одному или нескольким пробелам. Они являются так называемыми кванторами квантов регулярных выражений и выполняют такие матчи (взятые из документация):

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

Ответ 2

Те два вызова replaceAll всегда будут давать одинаковый результат, независимо от того, что x. Однако важно отметить, что два регулярных выражения не совпадают:

  • \\s - соответствует одиночному символу пробела
  • \\s+ - соответствует последовательности одного или нескольких пробельных символов.

В этом случае это не имеет никакого значения, поскольку вы заменяете все пустой строкой (хотя было бы лучше использовать \\s+ с точки зрения эффективности). Если бы вы заменили непустой строкой, они бы поступили иначе.

Ответ 3

Прежде всего, вам нужно понять, что конечный вывод обоих операторов будет таким же, как, например, удалить все пробелы из заданной строки.

Однако x.replaceAll("\\s+", ""); будет более эффективным способом обрезки пробелов (если строка может иметь несколько смежных пространств) из-за потенциально меньшего количества замен из-за того, что регулярное выражение \\s+ соответствует одному или нескольким местам одновременно и заменяет их с пустой строкой.

Итак, хотя вы получаете одинаковый результат от обоих, лучше использовать:

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

Ответ 4

Первое регулярное выражение будет соответствовать одному символу пробела. Второе регулярное выражение будет неохотно соответствовать одному или нескольким символам пробела. Для большинства целей эти два регулярных выражения очень похожи, за исключением во втором случае, регулярное выражение может соответствовать большей части строки, если оно мешает совпадению регулярного выражения. от http://www.coderanch.com/t/570917/java/java/regex-difference