1

分割方法に問題があります。splitメソッドを呼び出すプログラムを書きたい

("a?b?gf#sad", "#?")

戻ります

[a,?,b,?,gf,#,sad]

誰かがこの質問をどのように解決できるか教えてもらえますか?どうもありがとうございます。

4

3 に答える 3

2

これは少しトリッキーなので、「スプーンで食べさせます」。しかし、私は私の推論を示します。

まず、入力が消費されないという事実は、正規表現がゼロ幅の一致であることを意味します (したがって、何も消費しません)。これは、先読みおよび/または後読みを意味します。

次に、入力サンプルは完全な例ではありませんが、orの横 で分割が行われているようです。?#

これら 2 つの事実をまとめると、次の解決策が得られます。

"a?b?gf#sad".split("(?<=[?#])|(?=[?#])");

正規表現の意味は次のとおりです。

  • (?<=[?#])?前の文字がorであることをアサートする後読みです。#
  • (?=[?#])?次の文字がorであることをアサートする先読みです。#
  • A|B「AまたはB」を意味するため、正規表現全体はルックアラウンドのいずれかです

ここにテストがあります:

System.out.println(Arrays.toString("a?b?gf#sad".split("(?<=[?#])|(?=[?#])")));

出力:

[a, ?, b, ?, gf, #, sad]

分割を「単語以外の任意の文字」(単に?orではなく#) に拡張したい場合は、単に分割正規表現を次のように変更できることに注意してください。"(?<=\\W)|(?=\\W)"

于 2012-04-06T12:45:39.993 に答える
0

StringTokenizer を使用します。

    String s = "a?b?gf#sad";
    final StringTokenizer stringTokenizer = new StringTokenizer(s, "#?", true);
    String[] a = new String[stringTokenizer.countTokens()];
    int i = 0;
    while(stringTokenizer.hasMoreTokens())
        a[i++] = stringTokenizer.nextToken();
    System.out.println(Arrays.toString(a));

版画:

 [a, ?, b, ?, gf, #, sad]
于 2012-04-06T12:45:46.720 に答える
0

単語の境界で分割する必要があり、これはPatternの javadoc にあります。「境界マッチャー」を参照してください。実際、これは宿題なので、ドキュメントを読んでください。表現力の素敵な宝石があります。

"a?b?gf#sad".split("\\b");

2 つの特殊記号"a?#b?#gf##sad".

于 2012-04-06T13:04:24.623 に答える