27 августа, 2014 | Автор:
Naik | Категория:
Java |
Нет комментариев »
В данной статье будет рассмотрена замена и удаление повторяющихся символов в строке с помощью регулярных выражений Java.
Заменять и удалять повторяющиеся символы будет через функции замены класса
String.
У класса
String есть четыре метода для замены символов. Вот их сигнатуры:
- replace(char oldChar, char newChar):String
- replace(CharSequence target, CharSequence replacement):String
- replaceAll(String regex,String replacement):String
- replaceFirst(String regex,String replacement):String
Первые два метода в нашем случае не пригодятся, т.к. они нужны для замены одного символа (
char) на другой символ или последовательности символов (
CharSequence) на другую последовательность.
CharSequence - это интерфейс, который реализуют классы: String, StringBuilder и StringBuffer.
Остановимся на двух последних методах:
replaceAll и
replaceFirst. Оба метода первым параметром принимают регулярное выражение (
regex), а вторым параметром текст замены (
replacement).
replaceAll- заменяет все совпадения, а
replaceFirst заменяет только первое совпадение. В данной статье будет использоваться только
replaceAll.
- Представим себе следующую задачу: требуется удалить из строки все стоящие рядом два одинаковых символа. Например, из строки "keeshh" должна в итоге получиться строка "ks"
String text = "keeshh";
String result = text.replaceAll("([a-z])\\1", "");
System.out.println(result);//"ks"
replaceAll - функция для замены всех совпадений
[a-z] - выражение говорит о том, что на этом месте должен быть символ в диапазоне от a до z.
() - круглые скобки означают группировку, сослаться на которую можно по номеру, причем нумерация начинается с единицы
\1 - указывает на то, что в этом месте должен быть такой же текст, как в группировке под номером 1. Обратный слэш "\" необходимо экранировать, поэтому в выражении два слэша "\\"
- После удаление двух повторных символов, могут снова образоваться повторные символы.
Например, если в строке "keeshhs" заменить два подряд повторяющихся символа, то получится "kss", но подстроку "ss" также можно удалить. Поместим описанный выше код в цикл, который будет повторяться до тех пор, пока не будут заменены все повторные символы. В данной реализации будем пытаться удалять повторения, пока меняется (укорачивается) длина строки
String text = "keeshhs";
int len;
do{
len = text.length();//сохраняем длину строки
text = text.replaceAll("([a-z])\\1", "");
}while(len != text.length());//сравниваем новую длину строки с сохраненной длиной
System.out.println(text);//"k"
- Рассмотрим следующий пример. Нужно удалить все повторяющиеся подряд символы.
Например, для строки "keeeshh" результат должен быть "ks". Реализация:
String text = "keeeeshh";
text = text.replaceAll("([a-z])\\1+", "");
System.out.println(text);//"ks"
Как вы, наверное, заметили после единички добавился символ +. Плюс в регулярных означает, что предшествующий плюсу символ или группировка должна встретиться от одного раза и более. Можно также включить этот код в цикл, чтобы снова заменить появившиеся повторения.
- Теперь рассмотрим замену. Задача: имеется строка, необходимо из двух подряд идущих одинаковых символов оставить только один.
Пример: из строки "kkeesshh" получится строка "kesh".
Реализация:
String text = "kkeesshh";
text = text.replaceAll("([a-z])\\1", "$1");
System.out.println(text);//"kesh"
Для замены мы использовали выражение $1, которое говорит о том, что текст, соответствующий регулярному выражению, необходимо заменить на текст, соответствующий группировке с номером 1. В нашем случае группировка с номером - это текст, соответствующий шаблону [a-z].
Можно переписать код, используя группу с номером 2 для замены:
String text = "kkeesshh";
text = text.replaceAll("([a-z])(\\1)", "$2");
System.out.println(text);//"kesh"
Вторая группа соответствует шаблону \\1
- И напоследок заменим в строке все подряд повторяющиеся символы одним символом.
Например, строка "keeeeessshh" преобразуется в "kesh".
Реализация:
String text = "keeeeessshh";
text = text.replaceAll("([a-z])\\1+", "$1");
System.out.println(text);//"kesh"
Использование регулярных выражений позволяет писать более компактный код и, возможно, сэкономить время на наборе кода, если хорошо освоить регулярные выражения.
Добавить комментарий