Перейти к основному содержимому

Гуава CharMatcher

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

В этом кратком руководстве мы рассмотрим служебный класс CharMatcher в Guava.

1. Удалить специальные символы из строки

Начнем с удаления всех специальных символов из строки .

В следующем примере мы удаляем все символы, которые не являются цифрами или буквами, с помощью функции continueFrom() :

@Test
public void whenRemoveSpecialCharacters_thenRemoved(){
String input = "H*el.lo,}12";
CharMatcher matcher = CharMatcher.javaLetterOrDigit();
String result = matcher.retainFrom(input);

assertEquals("Hello12", result);
}

2. Удалить символы, отличные от ASCII, из строки

Мы также можем использовать CharMatcher для удаления символов, отличных от ASCII, из строки , как в следующем примере:

@Test
public void whenRemoveNonASCIIChars_thenRemoved() {
String input = "あhello₤";

String result = CharMatcher.ascii().retainFrom(input);
assertEquals("hello", result);

result = CharMatcher.inRange('0', 'z').retainFrom(input);
assertEquals("hello", result);
}

3. Удалить символы, не входящие в набор символов

Теперь давайте посмотрим, как удалить символы, которые не принадлежат данному набору символов . В следующем примере мы удалим символы, не принадлежащие набору символов «cp437 » :

@Test
public void whenRemoveCharsNotInCharset_thenRemoved() {
Charset charset = Charset.forName("cp437");
CharsetEncoder encoder = charset.newEncoder();

Predicate<Character> inRange = new Predicate<Character>() {
@Override
public boolean apply(Character c) {
return encoder.canEncode(c);
}
};

String result = CharMatcher.forPredicate(inRange)
.retainFrom("helloは");
assertEquals("hello", result);
}

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

4. Проверить строку

Далее — давайте посмотрим, как проверить строку с помощью CharMatcher .

Мы можем использовать matchAllOf() , чтобы проверить, все ли символы соответствуют условию. И мы можем использовать matchNoneOf() , чтобы проверить, не применяется ли условие к какому-либо из символов String .

В следующем примере мы проверяем, является ли наша строка строчной, содержит хотя бы один символ « e » и не содержит цифр:

@Test
public void whenValidateString_thenValid(){
String input = "hello";

boolean result = CharMatcher.javaLowerCase().matchesAllOf(input);
assertTrue(result);

result = CharMatcher.is('e').matchesAnyOf(input);
assertTrue(result);

result = CharMatcher.javaDigit().matchesNoneOf(input);
assertTrue(result);
}

5. Обрезать струну

Теперь давайте посмотрим, как обрезать строку с помощью CharMatcher .

В следующем примере мы используем trimLeading() , trimTrailing и trimFrom() , чтобы обрезать нашу строку :

@Test
public void whenTrimString_thenTrimmed() {
String input = "---hello,,,";

String result = CharMatcher.is('-').trimLeadingFrom(input);
assertEquals("hello,,,", result);

result = CharMatcher.is(',').trimTrailingFrom(input);
assertEquals("---hello", result);

result = CharMatcher.anyOf("-,").trimFrom(input);
assertEquals("hello", result);
}

6. Свернуть строку

Далее — давайте посмотрим, как свернуть String с помощью CharMatcher .

В следующем примере мы используем CollarFrom() для замены последовательных пробелов на ' - ':

@Test
public void whenCollapseFromString_thenCollapsed() {
String input = " hel lo ";

String result = CharMatcher.is(' ').collapseFrom(input, '-');
assertEquals("-hel-lo-", result);

result = CharMatcher.is(' ').trimAndCollapseFrom(input, '-');
assertEquals("hel-lo", result);
}

7. Заменить из строки

Мы можем использовать CharMatcher для замены определенных символов из строки , как в следующем примере:

@Test
public void whenReplaceFromString_thenReplaced() {
String input = "apple-banana.";

String result = CharMatcher.anyOf("-.").replaceFrom(input, '!');
assertEquals("apple!banana!", result);

result = CharMatcher.is('-').replaceFrom(input, " and ");
assertEquals("apple and banana.", result);
}

8. Подсчитайте появление символов

Наконец — давайте посмотрим, как подсчитать вхождения символов с помощью CharMatcher .

В следующем примере мы подсчитываем запятые и символы между ' a ':' h ':

@Test
public void whenCountCharInString_thenCorrect() {
String input = "a, c, z, 1, 2";

int result = CharMatcher.is(',').countIn(input);
assertEquals(4, result);

result = CharMatcher.inRange('a', 'h').countIn(input);
assertEquals(2, result);
}

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

В этой статье мы проиллюстрировали некоторые из наиболее полезных API-интерфейсов и примеры использования Guava для строк в реальном мире.

Полный исходный код доступен на GitHub .