В чем разница между следующими двумя выражениями?
x = x.replaceAll("\\s", "");
x = x.replaceAll("\\s+", "");
java
regex
string
quantifiers
mpluse
источник
источник
Ответы:
Первый соответствует одному пробелу, а второй соответствует одному или нескольким пробелам. Это так называемые квантификаторы регулярных выражений, и они выполняют такие сопоставления (взяты из документации ):
источник
Эти два
replaceAll
вызова всегда будут давать один и тот же результат, независимо от того, что этоx
такое. Однако важно отметить, что эти два регулярных выражения не совпадают:\\s
- соответствует одиночному пробельному символу\\s+
- соответствует последовательности из одного или нескольких символов пробела.В этом случае это не имеет значения, поскольку вы заменяете все пустой строкой (хотя было бы лучше использовать
\\s+
с точки зрения эффективности). Если бы вы заменяли непустую строку, они вели бы себя по-разному.источник
Прежде всего, вам нужно понять, что конечный результат обоих операторов будет одинаковым, то есть удалить все пробелы из данной строки.
Однако
x.replaceAll("\\s+", "");
это будет более эффективный способ обрезки пробелов (если строка может иметь несколько смежных пробелов) из-за потенциально меньшего количества замен из-за того, что регулярное выражение\\s+
соответствует 1 или более пробелам одновременно и заменяет их пустой строкой.Поэтому, даже если вы получаете одинаковый результат от обоих, лучше использовать:
источник
Первое регулярное выражение будет соответствовать одному пробельному символу. Второе регулярное выражение неохотно будет соответствовать одному или нескольким пробельным символам. В большинстве случаев эти два регулярных выражения очень похожи, за исключением второго случая, когда регулярное выражение может соответствовать большей части строки, если оно предотвращает сбой сопоставления регулярного выражения. из http://www.coderanch.com/t/570917/java/java/regex-difference
источник
\s+
не\s+?
похож на другой.