1

たとえば、次のフレーズを取りたいとします。

{{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メソッドを誰かが作成しようとすることはできますか?

4

4 に答える 4

1

現在のコードの問題のいくつかを次に示します。

  • 毎回ではなく、コンパイル済みを再利用する必要がありますPatternPattern.compile
  • 毎回ではなく、を再利用する必要がありますRandomnew Random
  • String.splitは正規表現ベースであることに注意してください。split("\\|")
  • Java 正規表現の中括弧は、文字どおり一致するようにエスケープする必要があることに注意してください。Pattern.compile("\\{([^{}]*)\\}");
  • デフォルトでグループ化するgroup(1)のではなく、を照会する必要がありますgroup()0
  • replaceFirst使い方が間違っています。Matcher.appendReplacement/Tail代わりに検索してください
  • Random.nextInt(int n)排他的な上限があります (Java の多くのそのようなメソッドのように)
  • アルゴリズム自体は、実際には任意にネストされた中括弧を適切に処理しません

エスケープは を前に付けることで行われ\、Java 文字列リテラルとして 2 倍にする必要があることに注意してください (つまり"\\"、1 文字のバックスラッシュが含まれます)。

付属品

于 2010-08-03T04:13:48.380 に答える
0

PHP と Python で作成したばかりです。デモはこちらhttp://spin.developerscrib.comです。非常に初期の段階なので、期待どおりに動作しない可能性があります。ソース コードは github にあります: https://github.com /razzbee/razzy-spinner

于 2016-04-25T03:46:30.353 に答える
0

正規表現を修正するには、外側の{との前にバックスラッシュを追加します}。これらは Java 正規表現のメタ文字です。ただし、それが機能するプログラムになるとは思いません。正規表現にバインドされた後に変数を変更しspunていますが、返された Matcher が更新された値を反映しているとは思いません。

また、ネストされた選択肢に対してpythonコードが機能するとは思いません。実際にpythonコードを試しましたか?「おそらく動作する」とあなたは言いますが、Java への移植に多くの時間を費やす前に、それを検証するのが賢明でしょう。

于 2010-08-03T04:09:00.863 に答える