Как да преброим броя на съвпаденията за Regex?

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

Регулярните изрази могат да се използват за различни задачи за обработка на текст, като алгоритми за преброяване на думи или валидиране на въвеждането на текст.

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

2. Използвайте случай

Нека разработим алгоритъм, способен да преброи колко пъти валиден имейл се появява в низ .

За да открием имейл адрес, ще използваме прост модел на регулярен израз:

([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])

Имайте предвид, че това е тривиален модел само за демонстрационни цели, тъй като действителният регулярен израз за съвпадение на валидни имейл адреси е доста сложен.

Ще ни трябва този регулярен израз вътре в обект Pattern, за да можем да го използваме:

Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("([a-z0-9_.-]+)@([a-z0-9_.-]+[a-z])");

Ще разгледаме два основни подхода, единият от които зависи от използването на Java 9 или по-нова версия.

За нашия примерен текст ще се опитаме да намерим трите имейла в низа:

"You can contact me through [email protected], [email protected], and [email protected]"

3. Преброяване на съвпадения за Java 8 и по-стари

Първо, нека видим как да броим съвпаденията, използвайки Java 8 или по-стара.

Един прост начин за преброяване на съвпаденията е да се прегледа методът за намиране на класа Matcher . Този метод се опитва да намери следващата последователност на входната последователност, която съответства на модела :

Matcher countEmailMatcher = EMAIL_ADDRESS_PATTERN.matcher(TEXT_CONTAINING_EMAIL_ADDRESSES); int count = 0; while (countEmailMatcher.find()) { count++; }

Използвайки този подход, ще намерим три съвпадения, както се очаква:

assertEquals(3, count);

Обърнете внимание, че находка метод не нулирате за съотнасяне след намери всеки мач - тя се възобновява, започващи от характера след края на предходната последователност съчетани, така че няма да работи, за да намерите припокриващи имейл адреси.

Например, нека разгледаме този пример:

String OVERLAPPING_EMAIL_ADDRESSES = "Try to contact us at [email protected]@baeldung.com, [email protected]"; Matcher countOverlappingEmailsMatcher = EMAIL_ADDRESS_PATTERN.matcher(OVERLAPPING_EMAIL_ADDRESSES); int count = 0; while (countOverlappingEmailsMatcher.find()) { count++; } assertEquals(2, count);

Когато регулярният израз се опитва да намери съвпадения в дадения низ, първо ще намери „[имейл защитен]“ като съвпадение. Тъй като няма част от домейна, предшестваща @, маркерът няма да бъде нулиран и второто „@ baeldung.com“ ще бъде игнорирано. Продължавайки, той също ще разгледа „[имейл защитен]“ като второ съвпадение:

Както е показано по-горе, имаме само две съвпадения в припокриващия се пример за имейл.

4. Преброяване на съвпадения за Java 9 и по-нови версии

Въпреки това, ако имаме по-нова версия на Java налице, можем да използваме резултатите от метода на Matcher клас. Този метод, добавен в Java 9, връща последователен поток от резултати от съвпадения, което ни позволява да преброим съвпаденията по-лесно:

long count = countEmailMatcher.results() .count(); assertEquals(3, count);

Както видяхме с find , Matcher не се нулира, докато обработва потока от метода на резултатите . По същия начин методът с резултати също няма да работи за намиране на съвпадения, които се припокриват.

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

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

Първо, научихме как да използваме метода find с цикъл while . След това видяхме как новият метод за стрийминг на Java 9 ни позволява да правим това с по-малко код.

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