たとえば、次のフレーズを取りたいとします。
{{Hello|What's Up|Howdy} {world|planet} | {さようなら|後で} {人々|市民|住民}}
ランダムに次のいずれかにします。
Hello world
Goodbye people
What's Up word
What's Up planet
Later citizens
etc.
基本的な考え方は、中かっこのすべてのペア内に、「|」で区切られた無制限の数の選択肢があるということです。プログラムは、ブレースのセットごとに 1 つの選択肢をランダムに選択する必要があります。ブレースは相互に無限にネストできることに注意してください。これに関するスレッドを見つけて 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}}");
私のプログラムのメインでは、パターン reg が宣言されている generateSpun の行でエラーが発生し、PatternSyntaxException が発生します。
java.util.regex.PatternSyntaxException: Illegal repetition
{([^{}]*)}
私がやろうとしていることを実行するJavaメソッドを誰かが作成しようとすることはできますか?