Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   String.replace() (https://forum.zone-game.info/showthread.php?t=23038)

[STIGMATED] 20.09.2012 18:04

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!

Собственно прощу помощи в этой нелёгкой задаче ;)

JavaMan 20.09.2012 18:18

Re: String.replace()
 
Ошибка в том, что ты заменяешь только первое совпадение (group(0)), так что используй Matcher#groupCount().

bloodshed 20.09.2012 20:10

Re: String.replace()
 
само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?

[STIGMATED] 20.09.2012 20:23

Re: String.replace()
 
Цитата:

Сообщение от bloodshed (Сообщение 228349)
само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?

Подстроку {1:2:3} нужно заменить на значения, которые внутри этой подстроки. 1 или 2 или 3. Причём, нужно сохранить каждые из этих вариантов.

bloodshed 20.09.2012 20:29

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

Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?

[STIGMATED] 20.09.2012 20:32

Re: String.replace()
 
Цитата:

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

Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?

Количество вариантов не считал, но, их должно быть много. Так как эта строка всего лишь пример. Количество вариантов между {} может быть и больше трех.

bloodshed 20.09.2012 22:11

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'ом не очень дружу, по быстрому получилось это.

Yorie 20.09.2012 23:48

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
Имхо :redlol: Учим мат. часть по рекурсивным функциям.

bloodshed 21.09.2012 00:22

Re: String.replace()
 
оффтоп:
Свернуть ↑Развернуть ↓

Yorie 21.09.2012 02:46

Re: String.replace()
 
offtop:
Свернуть ↑Развернуть ↓


Текущее время: 23:50. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot