Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
[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!
Собственно прощу помощи в этой нелёгкой задаче
Сообщений: 437
Тем: 7
Зарегистрирован: May 2011
Репутация:
2,580
Ошибка в том, что ты заменяешь только первое совпадение (group(0)), так что используй Matcher#groupCount().
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?
Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
bloodshed Написал:само правило regexp можно составить правильнее, для этих нужд, хотя они если честно не очень ясны.
Нужно получать или заменять то, что находится между символами {}?
Подстроку {1:2:3} нужно заменить на значения, которые внутри этой подстроки. 1 или 2 или 3. Причём, нужно сохранить каждые из этих вариантов.
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
Получается вариантов будет 9 в этом примере "Строка {1:2:3}, атататата {4:5:6}!"?
"Строка 1, атататата 4!"
"Строка 1, атататата 5!"
"Строка 1, атататата 6!"
"Строка 2, атататата 4!"
"Строка 2, атататата 5!"
"Строка 2, атататата 6!"
и тд.
Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?
Сообщений: 5,670
Тем: 145
Зарегистрирован: Nov 2008
Репутация:
33,771
bloodshed Написал:Получается вариантов будет 9 в этом примере "Строка {1:2:3}, атататата {4:5:6}!"?
"Строка 1, атататата 4!"
"Строка 1, атататата 5!"
"Строка 1, атататата 6!"
"Строка 2, атататата 4!"
"Строка 2, атататата 5!"
"Строка 2, атататата 6!"
и тд.
Или количество элементов между {} всегда одинаковое и делается только первый элемент с первым, второй со вторым и тд?
Количество вариантов не считал, но, их должно быть много. Так как эта строка всего лишь пример. Количество вариантов между {} может быть и больше трех.
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
[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'ом не очень дружу, по быстрому получилось это.
Сообщений: 247
Тем: 3
Зарегистрирован: Feb 2012
Репутация:
1,300
[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
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
оффтоп
"Спасибо" за совет. Я вам тоже дам один.
Если человек не применяет что-то в разработке, это не значит, что он этого не знает или знает не достаточно хорошо, чтоб применять.
И результаты работы у нас разные, так как я считал, что результат должен быть другим.
Сообщений: 247
Тем: 3
Зарегистрирован: Feb 2012
Репутация:
1,300
offtop
bloodshed Написал:
оффтоп
"Спасибо" за совет. Я вам тоже дам один.
Если человек не применяет что-то в разработке, это не значит, что он этого не знает или знает не достаточно хорошо, чтоб применять.
И результаты работы у нас разные, так как я считал, что результат должен быть другим.
А я, вообще-то, не Вам это писал, а топикстартеру, т.к. именно он не понимает, как можно это реализовать.
По поводу Вашего совета, высказанного непонятно к чему - если человек не применяет что-либо там, где это можно и даже нужно применять - значит он это не знает или, если знает, но не применяет, то он - плохой разработчик. Это опять же, не в Ваш адрес, а ответ на Ваш "совет". Не нужно бессмысленного агра.
// aka Deft
|