Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
String.replace()
#1
[src=java] String fraze = "Строка {1:2:3}, атататата {4:5:6}!";[/src]

C помощью реплейса нужно получить несколько вариантов строк. Например
Цитата:Строка 1, атататата 1
Цитата:Строка 2, атататата 2
Цитата:Строка 3, атататата 3
... и так далее, все возможные варианты.

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

[src=java]
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(":");
}
[/src]


Но, при попытке заменять строки
[src=java]
for (String aString : string) {
System.out.println(fraze.replace(regexMatcher.group(0), aString));
}
[/src]

Выходит такая ересь:
Код:
Строка 1, атататата {4:5:6}!
Строка 2, атататата {4:5:6}!
Строка 3, атататата {4:5:6}!
Строка {1:2:3}, атататата 4!
Строка {1:2:3}, атататата 5!
Строка {1:2:3}, атататата 6!

Собственно прощу помощи в этой нелёгкой задаче Wink
Ответ
#2
Ошибка в том, что ты заменяешь только первое совпадение (group(0)), так что используй Matcher#groupCount().
Ответ
#3
само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?
[Изображение: l2nextgen.gif]
Ответ
#4
bloodshed Написал:само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?

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

Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?
[Изображение: l2nextgen.gif]
Ответ
#6
bloodshed Написал:Получается вариантов будет 9 в этом примере "Строка {1:2:3}, атататата {4:5:6}!"?
"Строка 1, атататата 4!"
"Строка 1, атататата 5!"
"Строка 1, атататата 6!"
"Строка 2, атататата 4!"
"Строка 2, атататата 5!"
"Строка 2, атататата 6!"
и тд.

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

Количество вариантов не считал, но, их должно быть много. Так как эта строка всего лишь пример. Количество вариантов между {} может быть и больше трех.
Ответ
#7
[src=java]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");
}[/src]
с regexp'ом не очень дружу, по быстрому получилось это.
[Изображение: l2nextgen.gif]
Ответ
#8
[src=java]
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;
}
}
[/src]

Имхо :redlol: Учим мат. часть по рекурсивным функциям.
// aka Deft
Ответ
#9
оффтоп
[Изображение: l2nextgen.gif]
Ответ
#10
offtop
// aka Deft
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Расчёт копий String по буквам [STIGMATED] 7 2,396 08-28-2012, 10:29 AM
Последний пост: [STIGMATED]
  String в int array Thieff 7 6,466 10-24-2011, 12:38 PM
Последний пост: ALeKsIuS

Перейти к форуму:


Пользователи, просматривающие эту тему: 5 Гость(ей)