Скажем, например, я хочу взять эту фразу:
{{Привет | Что случилось | Привет} {мир | планета} | {До свидания | Позже} {люди | граждане | жители}}
и случайным образом превратите его в одно из следующих:
Hello world
Goodbye people
What's Up word
What's Up planet
Later citizens
etc.
Основная идея состоит в том, что в каждую пару фигурных скобок заключено неограниченное количество вариантов, разделенных знаком «|». Программа должна пройти и случайным образом выбрать один вариант для каждого набора подтяжек. Имейте в виду, что фигурные скобки могут бесконечно вкладываться друг в друга. Я нашел ветку об этом и попытался преобразовать ее в Java, но это не сработало. Вот код Python, который предположительно работал:
import re
from random import randint
def select(m):
choices = m.group(1).split('|')
return choices[randint(0, len(choices)-1)]
def spinner(s):
r = re.compile('{([^{}]*)}')
while True:
s, n = r.subn(select, s)
if n == 0: break
return s.strip()
Вот моя попытка преобразовать этот код Python в Java.
public String generateSpun(String text){
String spun = new String(text);
Pattern reg = Pattern.compile("{([^{}]*)}");
Matcher matcher = reg.matcher(spun);
while (matcher.find()){
spun = matcher.replaceFirst(select(matcher.group()));
}
return spun;
}
private String select(String m){
String[] choices = m.split("|");
Random random = new Random();
int index = random.nextInt(choices.length - 1);
return choices[index];
}
К сожалению, когда я пытаюсь проверить это, позвонив
generateAd("{{Hello|What's Up|Howdy} {world|planet} | {Goodbye|Later} {people|citizens|inhabitants}}");
В основном в моей программе он выдает ошибку в строке в generateSpun, где объявлен Pattern reg, что дает мне PatternSyntaxException.
java.util.regex.PatternSyntaxException: Illegal repetition
{([^{}]*)}
Может ли кто-нибудь попытаться создать метод Java, который будет делать то, что я пытаюсь сделать?