4

私は、Javaに次のようなメソッドがあるかどうかを調べようとしています。

以下のようなパラメータをメソッドに渡したい

"(hi|hello) my name is (Bob|Robert). Today is a (good|great|wonderful) day."

'|'で区切られた括弧内の単語の1つを選択するメソッドが必要です ランダムに選択された単語の1つを含む完全な文字列を返します。Javaにはこのためのメソッドがありますか、それともループ内の文字ごとのチェックを使用してこれを自分でコーディングする必要がありますか?

4

6 に答える 6

6

正規表現で解析できます。

正規表現は次のようになり\(\w+(\|\w+)*\)ます。置換では、「|」の引数を分割するだけです。ランダムな単語を返します。

何かのようなもの

import java.util.regex.*;

public final class Replacer {

  //aText: "(hi|hello) my name is (Bob|Robert). Today is a (good|great|wonderful) day."
  //returns: "hello my name is Bob. Today is a wonderful day."
  public static String getEditedText(String aText){
    StringBuffer result = new StringBuffer();
    Matcher matcher = fINITIAL_A.matcher(aText);
    while ( matcher.find() ) {
      matcher.appendReplacement(result, getReplacement(matcher));
    }
    matcher.appendTail(result);
    return result.toString();
  }

  private static final Pattern fINITIAL_A = Pattern.compile(
    "\\\((\\\w+(\\\|\w+)*)\\\)",
    Pattern.CASE_INSENSITIVE
  );

  //aMatcher.group(1): "hi|hello"
  //words: ["hi", "hello"]
  //returns: "hello"
  private static String getReplacement(Matcher aMatcher){
    var words = aMatcher.group(1).split('|');
    var index = randomNumber(0, words.length);
    return words[index];
  }

} 

(このコードはアイデアを説明するためだけに書かれており、おそらくコンパイルされないことに注意してください)

于 2012-06-29T05:44:11.933 に答える
5

それが役立つかもしれません、

メソッドの引数として、3つの文字列( "hi | hello")、(Bob | Robert)、および(good | great | wonderful)を渡します。

メソッド内で文字列を配列に分割し、firststringarray[]=thatstring.split("|");これを他の2つに使用します。

ランダムな文字列選択を使用するには、これを使用します

于 2012-06-29T05:51:19.303 に答える
1

私の知識によると、Javaにはそれを直接行う方法がありません。

私はそれのためのコードを書くか、regexeする必要があります

于 2012-06-29T05:44:03.437 に答える
0

Javaにはあなたが直接やりたいことをするものは何もないと思います。個人的には、正規表現や文字に基づいて何かを行う代わりに、次のようなメソッドを作成します。

String madLib(Set<String> greetings, Set<String> names, Set<String> dispositions)
{
    // pick randomly from each of the sets and insert into your background string
}
于 2012-06-29T05:47:17.010 に答える
0

これを直接サポートすることはできません。そして、理想的には低レベルのソリューションを試してはいけません。

「ランダムセンテンスジェネレータ」を検索する必要があります。あなたが書いている方法

`(Hi|Hello)`

などは文法と呼ばれます。文法のパーサーを作成する必要があります。ここでも、パーサーを作成するための多くのソリューションがあります。文法を指定する標準的な方法があります。BNFを探します。

パーサーとジェネレーターの問題は何度も解決されており、問題の興味深い部分は文法を書くことです。

于 2012-06-29T05:51:08.670 に答える
0

Javaは、このための既製のメソッドを提供していません。Penarturで説明されているように正規表現を使用するか、独自のJavaメソッドを作成して、文字列を分割し、ランダムな単語を格納できます。StringTokenizerクラスは、2番目のアプローチに従う場合に役立ちます。

于 2012-06-29T06:00:23.250 に答える