Рубрики
Без рубрики

Регулярные выражения \s и \s+ в Java

Узнайте о разнице между двумя регулярными выражениями на примерах

Автор оригинала: Kai Yuan.

1. Обзор

Подстановка строк-это стандартная операция, когда мы обрабатываем строки в Java.

Благодаря удобному методу replaceAll() в классе String мы можем легко выполнять подстановку строк с помощью регулярных выражений . Однако иногда выражения могут сбивать с толку, например, \s и \s+.

В этом коротком уроке мы рассмотрим разницу между двумя регулярными выражениями на примерах.

2. Разница между \s и \s+

Регулярное выражение \s является предопределенным классом символов. Он указывает на один символ пробела. Давайте рассмотрим набор пробелов:

[ \t\n\x0B\f\r]

Знак плюс + является жадным квантором, что означает один или несколько раз. Например, выражение X+ соответствует одному или нескольким символам X .

Таким образом, регулярное выражение \s соответствует одному символу пробела, в то время как \ s+ будет соответствовать одному или нескольким символам пробела.

3. замените All() Непустой заменой

Мы узнали значения регулярных выражений \s и \s+ .

Теперь давайте посмотрим, как метод replaceAll() ведет себя по-разному с этими двумя регулярными выражениями.

Мы будем использовать строку в качестве входного текста для всех примеров:

String INPUT_STR = "Text   With     Whitespaces!   ";

Давайте попробуем передать \s методу replaceAll() в качестве аргумента:

String result = INPUT_STR.replaceAll("\\s", "_");
assertEquals("Text___With_____Whitespaces!___", result);

Метод replaceAll() находит одиночные символы пробела и заменяет каждое совпадение символом подчеркивания. У нас есть одиннадцать пробелов во входном тексте. Таким образом, произойдет одиннадцать замен.

Далее передадим регулярное выражение \s+ в метод replace All() :

String result = INPUT_STR.replaceAll("\\s+", "_");
assertEquals("Text_With_Whitespaces!_", result);

Из – за жадного квантора + , то Заменить все() метод будет соответствовать самой длинной последовательности непрерывных пробелов и заменять каждое совпадение символом подчеркивания.

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

4. замените All() Пустой заменой

Другим распространенным использованием метода replaceAll() является удаление совпадающих шаблонов из входного текста. Обычно мы делаем это, передавая пустую строку в качестве замены метода.

Давайте посмотрим, какой результат мы получим, если удалим пробелы с помощью метода replaceAll() с помощью регулярного выражения \s :

String result1 = INPUT_STR.replaceAll("\\s", "");
assertEquals("TextWithWhitespaces!", result1);

Теперь мы передадим другое регулярное выражение \s+ в метод replaceAll() :

String result2 = INPUT_STR.replaceAll("\\s+", "");
assertEquals("TextWithWhitespaces!", result2);

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

assertEquals(result1, result2);

Если мы сравним эти два Заменить все() звонит, тот, с \s+ это более эффективно. Это происходит потому, что он выполняет работу только с тремя заменами, в то время как вызов с \s сделаем одиннадцать замен.

5. Заключение

В этой короткой статье мы узнали о регулярных выражениях \s и \s+ .

Мы также видели, как метод replaceAll() вел себя по-разному с этими двумя выражениями.

Как всегда, код доступен на GitHub .