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

1. Общ преглед

Заместването на низове е стандартна операция, когато обработваме низове в Java.

Благодарение на удобния метод replaceAll () в класа String , можем лесно да извършим заместване на низове с регулярни изрази. Понякога обаче изразите могат да объркат, например \ s и \ s +.

В този кратък урок ще разгледаме разликата между двата регулярни израза чрез примери.

2. Разликата между \ s и \ s +

Регулярният израз \ s е предварително дефиниран клас знаци. Той показва един-единствен празен знак. Нека да прегледаме набора от бели символи:

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

Знакът плюс + е алчен квантор, което означава един или повече пъти. Например изразът X + съвпада с един или повече X знака.

Следователно, регулярният израз \ s съответства на един знак за интервал, докато \ s + ще съответства на един или повече символи на интервал.

3. replaceAll () с непразна подмяна

Научихме значенията на регулярните изрази \ s и \ s + .

Сега нека да разгледаме как методът replaceAll () се държи по различен начин с тези два регулярни израза.

Ще използваме низ като входен текст за всички примери:

String INPUT_STR = "Text With Whitespaces! ";

Нека опитаме да предадем \ s на метода replaceAll () като аргумент:

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

Методът replaceAll () намира единични пробели и заменя всяко съвпадение с долна черта. Имаме единадесет бели знака във входния текст. Така ще настъпят единадесет замествания.

След това нека предадем регулярния израз \ s + на метода replaceAll () :

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

Поради алчния квантор + , методът replaceAll () ще съответства на най-дългата последователност от непрекъснати интервали и ще замени всяко съвпадение с долна черта.

В нашия въведен текст имаме три последователности от непрекъснати интервали. Следователно, всеки от трите ще стане долна черта.

4. replaceAll () с празна подмяна

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

Нека видим какъв резултат ще получим, ако премахнем бели символи, използвайки метода replaceAll () с регулярния израз \ s :

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

Сега ще предадем другия регулярен израз \ s + на метода replaceAll () :

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

Тъй като заместването е празен низ, двете извиквания replaceAll () дават един и същ резултат, въпреки че двата регулярни израза имат различни значения:

assertEquals(result1, result2);

Ако сравним двете обаждания replaceAll () , този с \ s + е по-ефективен. Това е така, защото върши работата само с три замествания, докато обаждането с \ s ще направи единадесет замествания.

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

В тази кратка статия научихме за регулярните изрази \ s и \ s + .

Видяхме и как методът replaceAll () се държи по различен начин с двата израза.

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