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番目から数えます。