String.replace() - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

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

Ответ
Опции темы
Непрочитано 20.09.2012, 18:04   #1
Аватар для [STIGMATED]
Супергерой

Автор темы (Топик Стартер) String.replace()

 String fraze = "Строка {1:2:3}, атататата {4:5:6}!";
Code: Java
C помощью реплейса нужно получить несколько вариантов строк. Например
Цитата:
Строка 1, атататата 1
Цитата:
Строка 2, атататата 2
Цитата:
Строка 3, атататата 3
... и так далее, все возможные варианты.

Достаю эти подстроки с помощью:

 
 Matcher regexMatcher = Pattern.compile("\\{(.*?)\\}").matcher(fraze);
 while (regexMatcher.find()) {
       String string[] = regexMatcher.group(0).substring(regexMatcher.group(0).indexOf("{") + 1, regexMatcher.group(0).indexOf("}")).split(":");
  }
 
Code: Java

Но, при попытке заменять строки
 
for (String aString : string) {
       System.out.println(fraze.replace(regexMatcher.group(0), aString));
}
 
Code: Java
Выходит такая ересь:
Код:
Строка 1, атататата {4:5:6}!
Строка 2, атататата {4:5:6}!
Строка 3, атататата {4:5:6}!
Строка {1:2:3}, атататата 4!
Строка {1:2:3}, атататата 5!
Строка {1:2:3}, атататата 6!
Собственно прощу помощи в этой нелёгкой задаче
[STIGMATED] вне форума Отправить сообщение для [STIGMATED] с помощью Skype™ Ответить с цитированием
Непрочитано 20.09.2012, 18:18   #2
Аватар для JavaMan

По умолчанию Re: String.replace()

Ошибка в том, что ты заменяешь только первое совпадение (group(0)), так что используй Matcher#groupCount().
JavaMan вне форума Ответить с цитированием
Непрочитано 20.09.2012, 20:10   #3
Аватар для bloodshed
Герой

По умолчанию Re: String.replace()

само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?
__________________
bloodshed вне форума Отправить сообщение для bloodshed с помощью ICQ Отправить сообщение для bloodshed с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 20.09.2012, 20:23   #4
Аватар для [STIGMATED]
Супергерой

Автор темы (Топик Стартер) Re: String.replace()

Цитата:
Сообщение от bloodshed Посмотреть сообщение
само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?
Подстроку {1:2:3} нужно заменить на значения, которые внутри этой подстроки. 1 или 2 или 3. Причём, нужно сохранить каждые из этих вариантов.
[STIGMATED] вне форума Отправить сообщение для [STIGMATED] с помощью Skype™ Ответить с цитированием
Непрочитано 20.09.2012, 20:29   #5
Аватар для bloodshed
Герой

По умолчанию Re: String.replace()

Получается вариантов будет 9 в этом примере "Строка {1:2:3}, атататата {4:5:6}!"?
"Строка 1, атататата 4!"
"Строка 1, атататата 5!"
"Строка 1, атататата 6!"
"Строка 2, атататата 4!"
"Строка 2, атататата 5!"
"Строка 2, атататата 6!"
и тд.

Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?
__________________
bloodshed вне форума Отправить сообщение для bloodshed с помощью ICQ Отправить сообщение для bloodshed с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 20.09.2012, 20:32   #6
Аватар для [STIGMATED]
Супергерой

Автор темы (Топик Стартер) Re: String.replace()

Цитата:
Сообщение от bloodshed Посмотреть сообщение
Получается вариантов будет 9 в этом примере "Строка {1:2:3}, атататата {4:5:6}!"?
"Строка 1, атататата 4!"
"Строка 1, атататата 5!"
"Строка 1, атататата 6!"
"Строка 2, атататата 4!"
"Строка 2, атататата 5!"
"Строка 2, атататата 6!"
и тд.

Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?
Количество вариантов не считал, но, их должно быть много. Так как эта строка всего лишь пример. Количество вариантов между {} может быть и больше трех.
[STIGMATED] вне форума Отправить сообщение для [STIGMATED] с помощью Skype™ Ответить с цитированием
Непрочитано 20.09.2012, 22:11   #7
Аватар для bloodshed
Герой

По умолчанию Re: String.replace()

public static final void main(final String[] args)
{
	final String example = "Stroka {1:gs Om:3}, atatatatat {4:5:gsom}!";
	final Pattern r = Pattern.compile("(\\{[0-9A-Za-z\\: ]+\\})");
 
	Matcher m = r.matcher(example);
	final StringBuffer sb = new StringBuffer();
 
	while (m.find())
	{
		String[] elements = m.group(0).replace("{", "").replace("}", "").split(":");
		for(int i = 0; i < elements.length; i++)
			replace(m, sb, i);
	}
 
	System.out.println(String.format("result:\n%s", sb.toString()));
}
 
static void replace(Matcher m, StringBuffer sb, final int index)
{
	m.reset();
	while (m.find())
	{
		String[] elements = m.group(0).replace("{", "").replace("}", "").split(":");
		m.appendReplacement(sb, elements[index]);
	}
	m.appendTail(sb);
	sb.append("\n");
}
Code: Java
с regexp'ом не очень дружу, по быстрому получилось это.
__________________
bloodshed вне форума Отправить сообщение для bloodshed с помощью ICQ Отправить сообщение для bloodshed с помощью Skype™ Ответить с цитированием
Непрочитано 20.09.2012, 23:48   #8
Аватар для Yorie

По умолчанию Re: String.replace()

 
public class main
{
	public static void main(String[] args)
	{
		String sample = "Строка {1:2:3}, атататата {4:5:6}, ололо {7:8:9}";
		for (String str : replacer(sample))
		{
			System.out.println(str);
		}
	}
 
	private static ArrayList<String> replacer(String str)
	{
		ArrayList<String> results = new ArrayList<String>();
		Pattern pattern = Pattern.compile("(\\{(.*?)\\})");
		Matcher matcher = pattern.matcher(str);
 
		if (matcher.find())
		{
			String[] nums = matcher.group(2).split(":");
			for (String num : nums)
			{
				String result = str.replace(matcher.group(1), num);
				results.addAll(replacer(result));
			}
		}
		else
		{
			results.add(str);
		}
		return results;
	}
}
 
Code: Java
Имхо Учим мат. часть по рекурсивным функциям.
__________________
// aka Deft
Yorie вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 21.09.2012, 00:22   #9
Аватар для bloodshed
Герой

По умолчанию Re: String.replace()

оффтоп:
Свернуть ↑Развернуть ↓
__________________
bloodshed вне форума Отправить сообщение для bloodshed с помощью ICQ Отправить сообщение для bloodshed с помощью Skype™ Ответить с цитированием
Непрочитано 21.09.2012, 02:46   #10
Аватар для Yorie

По умолчанию Re: String.replace()

offtop:
Свернуть ↑Развернуть ↓
__________________
// aka Deft
Yorie вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


© 2007–2019 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 03:18. Часовой пояс GMT +3.

Вверх