String クラス (livedocs@lab) のいくつかのメソッドは正規表現と一緒に使うことができます。文字列の中から特定の表現を抜き出したり置き換えたりしたいときにはなかなか便利です。
では、早速具体的なメソッドを見ていきましょう。
split() メソッド
split() メソッドは引数に渡されたパターンを区切りとして文字列を分解します。結果は配列に格納されます。
vvar myStr:String = "Happy like a honeybee"; trace(myStr.split("a")); // H,ppy like , honeybee が出力される
引数には正規表現も使えます。空白文字を区切りに指定してみます。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /\s+/; trace(myStr.split(myPattern)); // Happy,like,a,honeybee が出力される
正規表現に括弧が含まれると括弧内に一致した箇所も出力に含まれます。先ほどの正規表現に括弧を足してみます。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\s+)/; trace(myStr.split(myPattern)); // Happy, ,like, ,a, ,honeybee が出力される
オプションとして返す要素の最大数を指定できます。これは2つ目の引数に指定します。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\s+)/; trace(myStr.split(myPattern, 3)); // Happy, ,like が出力される
select() メソッド
select() メソッドは引数のパターンに一致する箇所があればその先頭文字のインデックスを返します。見つからなかった場合は -1 を返します。パターンには String 型または RegExp 型のオブジェクトを使用できます。
var myStr:String = "Happy like a honeybee"; trace(myStr.search("li")); // 6 が出力される var myPattern:RegExp = /(\w)\1/; trace(myStr.search(myPattern)); // 2 が出力される
select() メソッドでは最初に見つかった箇所しか知ることができません。g フラグや lastIndex は無視されます。
ちなみに indexOf() メソッドと lastIndexOf() メソッドを使えば検索開始位置を指定できます。ただし、正規表現は使用できません。
var myStr:String = "Happy like a honeybee"; // 6 文字目から後ろへ検索する trace(myStr.indexOf("a", 5)); // 11 が出力される // 6 文字目から前へ検索する trace(myStr.lastIndexOf("p", 5));; // 3 が出力される
lastIndexOf() はインデックス値を指定すると、指定された箇所から前に検索を行います。上の例では4文字目の p と先に一致するため返り値は 3 になっています。
match() メソッド
match() メソッドは引数のパターンに一致した箇所を配列として返します。パターンには文字列または正規表現を使用できます。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\w)\1/; trace(myStr.match(myPattern)); // pp が出力される
上記のように正規表現に g フラグが無い場合最初に一致した箇所のみが返されますが、g フラグを付けると文字列全体を検索します。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\w)\1/g; trace(myStr.match(myPattern)); // pp,ee が出力される
いずれの場合も lastIndex の値は使用されません。
replace() メソッド
replace() メソッドは1つ目の引数で指定されたパターンに一致した箇所を2つ目の引数を使って置き換えます。置き換え済の文字列が戻り値になります。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\w)\1/g; trace(myStr.replace(myPattern, "xx")); // Haxxy like a honeybxx が出力される
パターンには文字列と正規表現が使えます。オリジナルの文字列は変更されません。
でも、これだといつも置き換えに使う文字列は同じものになってしまいますね。そのため、第2引数には関数を指定することもできるようになっています。関数は一致するごとに呼ばれ、最初の引数に一致した部分、最後から2番目の引数に一致した箇所の先頭のインデックス、最後の引数に元の文字列が渡されます。
var myStr:String = "Happy like a honeybee"; trace(myStr.replace("li", myFunc)); // Happy li6ke a honeybee が出力される private function myFunc(...args):String { trace(args); // li,6,Happy like a honeybee が出力される return args[0] + args[1]; }
パターンに正規表現を使用した場合、正規表現が括弧を含むとそれぞれの括弧に一致した箇所も2つ目以降の引数として括弧の数だけ渡されます。
var myStr:String = "Happy like a honeybee"; var myPattern:RegExp = /(\w)\1/g; trace(myStr.replace(myPattern, myFunc)); // Hapy like a honeybe が出力される private function myFunc(...args):String { trace(args); // ee,e,19,Happy like a honeybee が出力される return args[1]; }
コメントする