Работа со строками в Java

Сегодня мы рассмотрим механизмы, которые позволяют работать со строками в языке Java. Также напишем примеры кода с реальных проектов, которые используют обработку строк.

В языке Java нет примитивного типа данных, который бы позволял в полной мере обрабатывать строки. Да, есть тип char. Но его функционал и емкость весьма ограничены. Поэтому де-факто классом для работы со строками является String.

Мы уже немного останавливались на этом классе в статье Строки в Java: String, StringBuilder, StringBuffer. Сегодня мы рассмотрим еще больше методов этого замечательного класса на примерах приближенных к реальности.

Первым примером будет метод split. Наверное Вы уже знаете что он создан для того, чтобы разбить строку по определенному параметру. Это может быть запятая, пробел, любой другой знак, или вообще можно разбить строку по буквам.

Допустим у нас есть урл из браузера.

работа со строками в джава

У меня есть задача — нужно чтобы программа смогла взять огромный урл и выбрать из него параметры. Так называемые request params. Когда Вы дойдете до веб программирования — то в полной мере сможете понять что такое параметры запроса.

В данном случае мне на помощь может прийти метод split. Параметры запроса идут после знака вопроса (?). Если параметров несколько они разделяются знаком &. Например google.com/search?q=eclipse&device=mac

В этом примере параметрами запроса будут q и device. А их значениями будут eclipse и mac соответственно. Именно так гугл понимает какой запрос Вы ввели. Из параметра q. Забавно правда? Ведь когда мы учим программирование нам говорят что нужно создавать осмысленные имена переменным. А сам гугл использует вместо нормального имени просто букву q. Не берите на вооружение подобные примеры. Называйте переменные осмысленно.

Так вот. Нам нужно взять строку урл из браузера, обработать ее таким образом, чтобы получить параметры запроса. Очевидно, что здесь нужно использовать split с разделителем &. Вот только перед этим нужно отбросить первую часть. Так как это будет основной урл. Мы можем сначала разделить строку по символу ?, отбросить первый элемент массива, и разбить второй элемент массива уже по символу &.

На деле выглядит проще чем кажется:

package com.javamaster;

public class StringExample {
	

	public static void main(String[] args) {

		String url = "https://www.google.com/search?q=eclipse+format+code+shortcut+mac&sxsrf=AOaemvJ8ksmErKd6cg5Z9syjKW06b41l2Q%3A1633588783197&ei=L5ZeYZ21C6mDxc8PkZSRgAs&oq=eclipse+format+code+shortcut+mac&gs_lcp=Cgdnd3Mtd2l6EAEYATIGCAAQFhAeMgYIABAWEB46BwgAEEcQsAM6BwgAELADEEM6BQgAEMsBOgUIABCABEoECEEYAFCenAFYw6QBYMiwAWgBcAJ4AIABbogBowOSAQMxLjOYAQCgAQHIAQrAAQE&sclient=gws-wiz";
		
		String secondPartOfUrl = url.split("\\?")[1];
		
		String[] urlParams = secondPartOfUrl.split("&");
		for(int i=0; i<urlParams.length; i++) {
			System.out.println(urlParams[i]);
		}
		
	}

}

Как и описано выше, сначала я обрезаю урл по символу ?. Так как это спец символ — его нужно экранировать. То есть добавить перед ним \\. Метод сплит возвращает массив строк. В моем случае первое разделение вернет мне массив из https://www.google.com/search и q=eclipse+format+code+shortcut+mac&sxsrf=AOaemvJ8ksmErKd6cg5Z9syjKW06b41l2Q%3A1633588783197&ei=L5ZeYZ21C6mDxc8PkZSRgAs&oq=eclipse+format+code+shortcut+mac&gs_lcp=Cgdnd3Mtd2l6EAEYATIGCAAQFhAeMgYIABAWEB46BwgAEEcQsAM6BwgAELADEEM6BQgAEMsBOgUIABCABEoECEEYAFCenAFYw6QBYMiwAWgBcAJ4AIABbogBowOSAQMxLjOYAQCgAQHIAQrAAQE&sclient=gws-wiz

Ну а дальше я беру второй элемент массива. Так как первый мне уже не нужен. Он не содержит нужную мне информацию. У меня строка secondPartOfUrl будет равна:q=eclipse+format+code+shortcut+mac&sxsrf=AOaemvJ8ksmErKd6cg5Z9syjKW06b41l2Q%3A1633588783197&ei=L5ZeYZ21C6mDxc8PkZSRgAs&oq=eclipse+format+code+shortcut+mac&gs_lcp=Cgdnd3Mtd2l6EAEYATIGCAAQFhAeMgYIABAWEB46BwgAEEcQsAM6BwgAELADEEM6BQgAEMsBOgUIABCABEoECEEYAFCenAFYw6QBYMiwAWgBcAJ4AIABbogBowOSAQMxLjOYAQCgAQHIAQrAAQE&sclient=gws-wiz

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

У нас в коде есть пара потенциальных багов. Что если строка которую мы разбиваем будет пуста или нулл? Тогда у нас будет ошибка во время выполнения. Участок кода url.split(«\?»)[1]; очень опасный. мы вызываем сплит для url переменной. А что если она null? Тогда у нас будет NullPointerException. А если эта строка пустая (не содержит символов) — тогда мы получим ArrayIndexOfBoundException так как мы берем второй элемент массива. Помним что нумерация в массивах начинается с 0. Если строка будет пуста или она будет без параметров запроса — наш код выполнится с ошибкой. Давайте добавим немного проверки и заодно посмотрим на еще один метод для обработки строк.

package com.javamaster;

public class StringExample {

	public static void main(String[] args) {

		 String url =
		 "https://www.google.com/search?q=eclipse+format+code+shortcut+mac&sxsrf=AOaemvJ8ksmErKd6cg5Z9syjKW06b41l2Q%3A1633588783197&ei=L5ZeYZ21C6mDxc8PkZSRgAs&oq=eclipse+format+code+shortcut+mac&gs_lcp=Cgdnd3Mtd2l6EAEYATIGCAAQFhAeMgYIABAWEB46BwgAEEcQsAM6BwgAELADEEM6BQgAEMsBOgUIABCABEoECEEYAFCenAFYw6QBYMiwAWgBcAJ4AIABbogBowOSAQMxLjOYAQCgAQHIAQrAAQE&sclient=gws-wiz";
		if (url == null || url.isBlank()) {//url.isEmpty()
			System.out.println("Url is blank");
		} else {
			if(url.contains("?")) {
				String secondPartOfUrl = url.split("\\?")[1];

				
				String[] urlParams = secondPartOfUrl.split("&");
				for (int i = 0; i < urlParams.length; i++) {
					System.out.println(urlParams[i]);
				}
			}
			
		}

	}

}

В примере выше мы использовали метод isBlank() — который проверяет пуста ли строка. Также работает и метод isEmpty(). Еще мы использовали contains(«?»). Он проверяет содержит ли строка определенный символ. Теперь наш код избавлен от потенциально опасных участков.

Давайте теперь попробуем изменить сайт, на который идет запрос. Именно так и работают фишинговые сайты. Они подменяют исходный урл и перенапрявляют Ваш запрос на свой вредоносный ресурс в надежде украсть у Вас данные.

Нам нужно чтобы исходный адрес гугла был подменен на наш адрес. Вот что получилось у меня:

package com.javamaster;

public class StringExample {
	

	public static void main(String[] args) {

		String url = "https://www.google.com/search?q=eclipse+format+code+shortcut+mac&sxsrf=AOaemvJ8ksmErKd6cg5Z9syjKW06b41l2Q%3A1633588783197&ei=L5ZeYZ21C6mDxc8PkZSRgAs&oq=eclipse+format+code+shortcut+mac&gs_lcp=Cgdnd3Mtd2l6EAEYATIGCAAQFhAeMgYIABAWEB46BwgAEEcQsAM6BwgAELADEEM6BQgAEMsBOgUIABCABEoECEEYAFCenAFYw6QBYMiwAWgBcAJ4AIABbogBowOSAQMxLjOYAQCgAQHIAQrAAQE&sclient=gws-wiz";
		
		String newUrl = url.replace("www.google.com", "java-master.com");
		
		System.out.println(newUrl);
	
	}

}

На этот раз я использовал метод replace. Ему нужно указать что заменить, на что. В результате работы я получил следующий результат:

Таким образом, данные, которые ввел пользователь получит не google, а мой сайт (java-master.com).

Не буду показывать как работают toUpperCase(), toLowerCase(). Они просто меняют регистр букв в строке.

Еще один метод, которым часто приходится пользоваться в повседневной работе: trim().

Данный метод удаляет пробелы из строки:

Еще один метод это format. Он является статическим методом из класса String. Прежде всего его используют для форматирования строки при обработке.

Давайте предположим что перед Вами задача отправить емейл сразу нескольким пользователям в системе. Нужно подставить в тело письма — данные о пользователе. Сделать это максимально красиво, без использования конкатенирования (плюсовать строку к строке) довольно не просто. String.format может нас выручить.

package com.javamaster;

public class StringExample {

	public static void main(String[] args) {

		String emailBody = "Hi, %s! Thanks for registration. Your login in the system is: %s";

		String[] usersToWelcome = { "Boris Britva", "Ivan Drago", "Natalia Romanova" };

		for (int i = 0; i < usersToWelcome.length; i++) {
			String userFullName = usersToWelcome[i];
			String userLogin = userFullName.substring(0, 2).toLowerCase() + userFullName.split(" ")[1].substring(0, 2).toLowerCase();

			System.out.println(String.format(emailBody, userFullName, userLogin));
		}

	}

}

В строку помещается специальный символ %s. Потом вызывается метод String.format(). Он принимает строку и аргументы, которые будут на месте символов %s.

Как видно на примере выше — мы задействовали String.format чтобы подставить имя пользователя и его логин в тело емейла. Попутно мы использовали метод substring чтобы обрезать строку. Первый параметр это с какого символа обрезать. Нумерация идет с 0. Второй параметр — это до какого символа обрезать.

Строка userFullName.substring(0, 2).toLowerCase() + userFullName.split(» «)[1].substring(0, 2).toLowerCase(); — это просто попытка сгенерировать логин исходя из полного имени пользователя. Сначала я обрезаю первые 2 буквы из имени и привожу их к нижнему регистру. Потом я беру фамилию и отбираю из нее еще 2 буквы, которые тоже привожу к нижнему регистру.

В результате выполнения у меня результат выглядит следующим образом:

результат обработки строк

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

Теперь Вы знаете больше как обрабатываются строки в программировании на Java. Не забудьте проделать все примеры у себя локально. Чтобы понять как работает код.

Для лучшего закрепления материала советую проделать еще несколько обработок. Например есть массив из дат. Нужно понять когда у юзера день рождение. Можете писать свои решения в комменты.

Не забывайте заходить в наш телеграмм. Там я иногда публикую Материалы, которые не попадают на сайт. Также подписывайтесь на ютуб канал. Там полезные видео на английском.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: