JScript.NET  新JavaScript入門  JavaScript,Neo-Generation  DOM  WSH  掲示板  表紙
Written 7/30/03
JScript.NET
String
概要
文字列を扱うためのクラスには、 .NET FrameworkにはJScriptのStringオブジェクトに似た System.Stringクラスと 効率化のためにある System.Text.StringBuilderクラスがあります。
メンバ
System.Stringクラスのメンバには JScriptのStringオブジェクトと似たものが多いです。 微妙に違うものが多いので注意して下さい。 解説なしに紹介します。
    var str : String = "0123456789";
    print(str.Length);              //10
    //検索系
    print(str.indexOf("23"));       //2
    print(str.indexOf("32"));       //-1
    print(str.LastIndexOf("3"));    //3
    //文字列抽出
    print(str.Chars(2));            //2
    print(str.Substring(5, 2));     //56
    //置換
    print(str.Replace("2345", "ZYX"));  //01ZYX6789
    //配列
    print(str.Split("5"));          //01234,6789
    var ary : String[] = new String[3];
    ary = [ "a", "b", "c" ];
    print(String.Join("/", ary));   //a/b/c
    //変換
    var str2 : String = "zyX";
    print(str2.ToLower());          //zyx
    print(str2.ToUpper());          //ZYX
 
その他のメソッドで、この2つは解説がいらないでしょう。
    var str : String = "0123456789";
    print(str.Remove(2, 4));        //016789
    print(str.Insert(2, "ZYX"));    //01ZYX23456789
 
次のメソッドは、指定した長さになるまで指定したUnicode文字を埋め込みます。
    var str : String = "0123456789";
    print(str.PadLeft(12));         //  0123456789
    print(str.PadRight(12, "s"));   //0123456789ss
 
最初のように文字を指定しない場合はスペースが挿入されます。
次のメソッドは、先頭または終わりが指定した文字列と一致するかどうかを返します。
    var str : String = "0123456789";
    print(str.StartsWith("01234")); //true
    print(str.EndsWith("01234"));   //false
 
処理を速くする
例えば、次のようなコードをコンパイルしてみましょう。
    var s : String = "a";
    for(var i = 0; i < 9; i++)
        s += "a";
    print(s);             //aaaaaaaaaa
 
そうするとコンパイラに次のように怒られてしまいます。
    warning JS1255: 文字列の連結にプラス演算子を使うと速度が低下し
    ます。System.Text.StringBuilder の使用を推奨します。
 
まったく余計なお世話なのですが、
少しでもコードの実行を速くしたい人は気にしましょう。
要するにStringを System.Text.StringBuilder に変換してから処理して、 またStringに変換すると速くなることがあります。
    import System;
    import System.Text;
    
    var s : StringBuilder = new StringBuilder("a");
    for(var i = 0; i < 9; i++)
        s.Append("a");
    print(s.ToString());  //aaaaaaaaaa
 
これが本当に速いのかどうかはおいといて、
次のようなコードでは、
    var s : String = "a";
    s += "b";
 
sが指す文字列に"b"という文字列が追加されたように見えますが、 そうではなくて、sが指す文字列は不変で、新たに"ab"という文字列が作られ、 sはそちらの方を指すようになります。
このようにStringに何かをするといつも新たなオブジェクトが作られるので、 いちいち時間がかかってしまいます。
これに対して、StringBuilderはふつうの配列だと思われます。
    var s : StringBuilder = new StringBuilder("a");
    s.Append("b");
 
最初に16文字分の領域を確保しているので (ArrayListと同じ)、 2番目に"b"を表すコードを書き込むだけ(ではないけれど)で済みます。
念のためスピードを実感できるコードを書いてみましょう。
    string_add.js
    ------------------------------------------
    import System;
    
    var t : int = Environment.TickCount;
    var n : int = 20000;
    var s : String = "";
    for(var i : int = 0; i < n; i++)
        s += "a";
    print(s.Substring(n / 2, 10));
    print((Environment.TickCount - t) + "ms");
    
    string_add2.js
    --------------------------------------------
        ...
    var s : StringBuilder = new StringBuilder();
    for(var i : int = 0; i < n; i++)
        s.Append("a");
    print(s.ToString().Substring(n / 2, 10));
        ...
 
"a"を20000個連ねる文字列を作り、そこから真ん中へん10個を抜き出して表示します。 うちでは下のほうが500倍くらい速かったです。 nを大きくするともっと差が開くでしょう。
StringBuilderのメンバをいくつか紹介します。 詳細はStringBuilder メンバ(MS) をご覧ください。
    import System;
    import System.Text;
    
    var s : StringBuilder = new StringBuilder("ZYX");
    print(s.Length);         //3 文字列の長さ
    print(s.Capacity);       //16 容量
    s.Capacity = 256;        //容量の変更もできる
    print(s.Chars(1));       //"Y"
    s.Chars(1) = "A";        //コンパイルエラー βのときは動いたんだが
    s.Replace("Y", "A");     //全ての"Y"を"A"に置換
    print(s);                //"ZAX" ToStringは自動的に働く
    s.Insert(2, "aY");       //2番目に"aY"を挿入
    print(s);                //"ZAaYX"
    s.Remove(1, 2);          //1番目から2文字削除
    print(s);                //"ZXY"
 
文字はもちろん0番目から数えます。
データ型, 書式(1), 書式(2), 文字列(JavaScript), exit