3

delim "//" で文字列を分割しようとしています。私の文字列には「/」とStringTokenizerも含まれており、奇妙な結果が得られ、「/」で文字列が壊れます。

  String  mStr = "abcd//aaa//32434//3/34343";
        StringTokenizer tok = new StringTokenizer(mStr, "//");
        while(tok.hasMoreTokens()){
            System.out.println(tok.nextToken());
        }

結果は

abcd
aaa
32434
3
34343

そして、期待される結果は

    abcd
    aaa
    32434
    3/34343

なぜこれが起こっているのか、そしてその解決策は何ですか?「/」を他の文字に置き換えたくありません。

4

4 に答える 4

9

StringTokenizer両方のトークンを別々のものとして受け取り、両方でトークン化します。//したがって、 と の両方でトークン化されている/ため、結果が得られます。


String#split私はむしろより好きStringTokenizerです。より使いやすく、より多くのオプションがあります。Regexパラメータとして受け取ることができ、後で使用できる を返します: array-tokens

String  mStr = "abcd//aaa//32434//3/34343";

String[] arr = mStr.split("//");
System.out.println(Arrays.toString(arr));

出力 : -

[abcd, aaa, 32434, 3/34343]
于 2012-11-30T06:13:24.963 に答える
3

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.htmlから:

StringTokenizer のインスタンスは、true または false の値を持つ returnDelims フラグを使用して作成されたかどうかに応じて、次の 2 つの方法のいずれかで動作します。

  • フラグが false の場合、区切り文字はトークンを区切るために使用されます。トークンは、区切り文字ではない連続した文字の最大シーケンスです。
  • フラグが true の場合、区切り文字自体がトークンと見なされます。したがって、トークンは、1 つの区切り文字、または区切り文字ではない連続した文字の最大シーケンスのいずれかです。

StringTokenizer区切り文字列自体ではなく、常に連続する区切り文字で分割されます。したがって、分割は「任意の数のスラッシュまたはスラッシュ」です。//2 つのスラッシュまたはスラッシュです。/1 つのスラッシュまたはスラッシュです。したがって、StringTokenizer両方のシーケンスをセパレーターとして一致させます。

つまり、 yourStringTokenizerは次の正規表現で分割することと同じです: [//]+、そして//思ったほどではありません。

于 2012-11-30T06:11:29.083 に答える
2

StringTokenizerは非常に単純なクラスです。トークナイザーのような機能が必要な場合はScanner、区切り文字列を正規表現と見なすため、 を使用できます。

    String mStr = "abcd//aaa//32434//3/34343";
    Scanner scanner = new Scanner(mStr);
    scanner.useDelimiter("//");
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }
于 2012-11-30T06:16:15.233 に答える
1

- split()の方法はString、 with で問題なく実行でき//ますdelimiter

public class Reg {

    public static void main(String[] args){

        String s = "abcd//aaa//32434//3/34343";
        String[] arr = s.split("//");

                for (String x : arr){

            System.out.println(x);
        }
       }
}
于 2012-11-30T06:17:14.820 に答える