5

Scanner と Delimiter を使用して .txt ファイルをトークン化しています (これは宿題です)。ファイルの最初のバージョンは次のようになります。

5,5,5,6,5,8,9,5,6,8, good, very good, excellent, good
7,7,8,7,6,7,8,8,9,7,very good, Good, excellent, very good
8,7,6,7,8,7,5,6,8,7 ,GOOD, VERY GOOD, GOOD, AVERAGE
9,9,9,8,9,7,9,8,9,9 ,Excellent, very good, very good, excellent
7,8,8,7,8,7,8,9,6,8 ,very good, good, excellent, excellent
6,5,6,4,5,6,5,6,6,6 ,good, average, good, good
7,8,7,7,6,8,7,8,6,6 ,good, very good, good,  very good
5,7,6,7,6,7,6,7,7,7  ,excellent, very good, very good, very good

そして、私はuseDelimiter("[ ]*(,)[ ]*")ファイルの2番目のバージョンを次のように使用しました:

5 5 5 6 5 8 9 5 6 8 good, very good, excellent, good
7 7 8 7 6 7 8 8 9 7 very good, Good, excellent, very good
8 7 6 7 8 7  5 6 8 7 GOOD, VERY GOOD, GOOD, AVERAGE
9 9 9 8 9 7 9  8 9 9 Excellent, very good, very good, excellent
7 8 8 7 8 7 8 9 6 8 very good, good, excellent, excellent
6 5 6 4 5 6 5 6 6 6 good, average, good, good
7  8 7 7 6 8 7 8 6 6 good, very good, good,  very good
5 7 6 7 6 7 6 7 7 7  excellent, very good, very good, very good

そして、数字をスペースで、単語をコンマで区切るのに役立つ正規表現を思いつくことができません。基本的に、14個の値を持つ配列が必要です(単一の変数であることは非常に良いです)

複数のスペースがあることに注意してください (これは、わかりにくくするために意図的に行われます)。

したがって、どんな種類の助けもいただければ幸いです。

PS区切り記号のみを使用できます(分割などは不可)。

4

4 に答える 4

4

これは機能するはずです。重要なのは、肯定的な後読み ( (<?=)) と代替 ( |) です。

String input = "9 9 9 8 9 7 9  8 9 9 Excellent, very good, very good, excellent";
Scanner s = new Scanner(input).useDelimiter("(?<=\\d)[\\s,]+|\\s*,\\s*");
while (s.hasNext()) {
    System.out.println("Token: ." + s.next() + ".");
}

版画:

Token: .9.
Token: .9.
Token: .9.
Token: .8.
Token: .9.
Token: .7.
Token: .9.
Token: .8.
Token: .9.
Token: .9.
Token: .Excellent.
Token: .very good.
Token: .very good.
Token: .excellent.
于 2013-02-21T17:22:19.857 に答える
2

Scanner区切り文字はいつでも変更できることに注意してください。入力テキストが常に先頭に 10 個の数字、末尾に 4 つの単語グループがあると信頼できる場合は、スペース ( \s+) で分割するだけの区切り文字から始めて、 を 10 回呼び出した後nextInt()、分割する区切り文字に切り替えることができます。カンマとスペース ( \s*,\s*)。

何かのようなもの:

String input = "5 5 5 6 5 8 9 5 6 8 good, very good, excellent, good";
Scanner scanner = new Scanner(input).useDelimiter("\\s+");
int[] results = new int[14];
for (int i = 0; i < 10; ++i) {
    results[i] = scanner.nextInt();
}
scanner.useDelimiter("\\s*,\\s*");
scanner.skip("\\s*");
for (int i = 10; i < 14; ++i) {
    String wordPhrase = scanner.next();
    int wordValue;
    if ("average".equalsIgnoreCase(wordPhrase))
        wordValue = 1;
    else if ("good".equalsIgnoreCase(wordPhrase))
        wordValue = 2;
    else if ("very good".equalsIgnoreCase(wordPhrase))
        wordValue = 3;
    else if ("excellent".equalsIgnoreCase(wordPhrase))
        wordValue = 4;
    else
        wordValue = 0;
    results[i] = wordValue;
}

幅ゼロのルックアラウンド アサーションを使用して単一の区切り文字正規表現でこれを行うことも可能ですが、これは単純な宿題の問題としてはおそらく少し高度です。

于 2013-02-21T16:51:08.547 に答える
2

あなたはこれを試すことができます(((?<=[0-9]+)\s*(?=[0-9]+))|(,\s*(?=[a-zA-Z]+))|((?<=[0-9]+)\s*(?=[a-zA-Z]+)))、ひどいように見えますが、うまくいくはずです

于 2013-02-21T16:39:49.397 に答える
0
String[] str = expression.split("(,\\s+)|(\\s+)");

これを試して:

于 2013-02-21T16:42:59.007 に答える