ストリング内に含まれるサブストリングおよびパターンの検索

Flash Player 9 以降、Adobe AIR 1.0 以降

サブストリングとは、ストリング内の一部を構成する連続した文字です。 例えば、ストリング「 abc 」のサブストリングは、「」、「 a 」、「 ab 」、「 abc 」、「 b 」、「 bc 」、「 c 」です。ストリング内のサブストリングは ActionScript のメソッドを使用して抽出できます。

パターンは、ActionScript ではストリングまたは正規表現によって定義されます。 例えば、次の正規表現は、文字 A、B、C の後に数字が続く特定のパターンを定義します(スラッシュは正規表現の区切り記号です)。

/ABC\d/

ActionScript には、ストリング内のパターンを検索し、一致するパターンが見つかった場合に、置換サブストリングと置き換えるメソッドが用意されています。 それらのメソッドについては、次のセクションで説明します。

正規表現を使用すると複雑なパターンを定義できます。 詳しくは、 正規表現の使用 を参照してください。

サブストリングの文字位置による検索

substr() substring() メソッドは似ています。いずれもストリング内のサブストリングを戻り値として返すメソッドです。 また、指定するパラメーターは 2 つであり、 どちらのメソッドでも、最初のパラメーターは、与えられたストリングの開始文字の位置です。 しかし、 substr() メソッドの場合はサブストリングの長さを第 2 パラメーターで指定するのに対し、 substring() メソッドの場合はサブストリングの終了位置を第 2 パラメーターで指定します(終了位置にある文字そのものは戻り値に含まれません)。2 つのメソッドの違いを確認できる例を次に示します。

var str:String = "Hello from Paris, Texas!!!"; 
trace(str.substr(11,15)); // output: Paris, Texas!!! 
trace(str.substring(11,15)); // output: Pari

slice() メソッドの機能は、 substring() メソッドに似ています。2 つの負でない整数をパラメーターとして与えた場合、両方のメソッドは完全に同じ働きをします。 しかし、 slice() メソッドではパラメーターに負の整数を指定することもでき、その場合は、ストリングの末尾を基準として文字の位置を指定したことになります。例を次に示します。

var str:String = "Hello from Paris, Texas!!!"; 
trace(str.slice(11,15)); // output: Pari 
trace(str.slice(-3,-1)); // output: !! 
trace(str.slice(-3,26)); // output: !!! 
trace(str.slice(-3,str.length)); // output: !!! 
trace(str.slice(-8,-3)); // output: Texas

slice() メソッドのパラメーターには、負でない整数と負の整数を組み合わせて指定できます。

一致するサブストリングの文字位置の検索

次の例に示すように、 indexOf() lastIndexOf() メソッドを使用して、ストリング内の一致するサブストリングの位置を特定することができます。

var str:String = "The moon, the stars, the sea, the land"; 
trace(str.indexOf("the")); // output: 10

indexOf() メソッドでは大文字と小文字が区別されます。

次のように第 2 パラメーターを指定すると、ストリング内で検索を開始する位置を示すことができます。

var str:String = "The moon, the stars, the sea, the land" 
trace(str.indexOf("the", 11)); // output: 21

lastIndexOf() は、ストリング内に一致するサブストリングが最後に出現する位置を検索するメソッドです。

var str:String = "The moon, the stars, the sea, the land" 
trace(str.lastIndexOf("the")); // output: 30

lastIndexOf() メソッドで次のように第 2 パラメーターを指定すると、ストリング内の指定したインデックス位置から先頭に向かって(右から左へ)検索が実行されます。

var str:String = "The moon, the stars, the sea, the land" 
trace(str.lastIndexOf("the", 29)); // output: 21

区切り記号で分割されたサブストリング配列の作成

split() メソッドを使用して、区切り記号に基づいて分割されたサブストリングの配列を作成できます。例えば、カンマ区切りやタブ区切りのデータを含んだストリングを複数のストリングに分割できます。

次の例では、アンパサンド(&)を区切り文字としてストリングを分割し、サブストリングの配列を作成します。

var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65"; 
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

split() メソッドの第 2 パラメーターはオプションで、返される配列の最大サイズを指定します。

区切り文字には、次のように正規表現を指定することもできます。

var str:String = "Give me\t5." 
var a:Array = str.split(/\s+/); // a == ["Give","me","5."]

詳しくは、 正規表現の使用 および『 Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド 』を参照してください。

ストリング内のパターンの検索およびサブストリングの置換

String クラスには、ストリング内のパターンを扱う次のメソッドがあります。

  • match() および search() メソッドでは、パターンに一致するサブストリングを検索できます。

  • replace() メソッドでは、パターンに一致するサブストリングを検索し、該当する部分を指定のサブストリングに置換できます。

それらのメソッドについては、次のセクションで説明します。

これらのメソッドで使用するパターンは、ストリングまたは正規表現によって定義できます。 正規表現について詳しくは、 正規表現の使用 を参照してください。

一致するサブストリングの検索

search() メソッドは、この例に示すように、特定のパターンに一致する最初のサブストリングのインデックス位置を返します。

var str:String = "The more the merrier."; 
// (This search is case-sensitive.) 
trace(str.search("the")); // output: 9 

検索するパターンは、次の例に示すように、正規表現を使用して定義することもできます。

var pattern:RegExp = /the/i; 
var str:String = "The more the merrier."; 
trace(str.search(pattern)); // 0

ストリングの先頭にある文字のインデックス位置は 0 なので、この場合は trace() メソッドで 0 が出力されます。正規表現の i フラグを設定することで、大文字と小文字を区別せずに検索を実行しています。

search() メソッドは、一致するサブストリングを 1 つだけ検索してその開始位置のインデックスを返します。たとえ g (グローバル)フラグを設定しても、複数の一致箇所を検索することはありません。

次の例では、より複雑な正規表現を指定することで、二重引用符に囲まれたストリングを検索します。

var pattern:RegExp = /"[^"]*"/; 
var str:String = "The \"more\" the merrier."; 
trace(str.search(pattern)); // output: 4 
 
str = "The \"more the merrier."; 
trace(str.search(pattern)); // output: -1  
// (Indicates no match, since there is no closing double quotation mark.)

match() メソッドの機能も search() メソッドと似ており、パターンに一致するサブストリングを検索する点は同じです。 ただし、次のように正規表現パターンでグローバルフラグを指定すると、 match() の場合は一致したサブストリングの配列を返します。

var str:String = "bob@example.com, omar@example.org"; 
var pattern:RegExp = /\w*@\w*\.[org|com]+/g; 
var results:Array = str.match(pattern);

results 配列は、次のように設定されます。

["bob@example.com","omar@example.org"]

正規表現について詳しくは、 正規表現の使用 を参照してください。

一致するサブストリングの置換

次の例に示すように、 replace() メソッドを使用して、ストリング内の指定されたパターンを検索し、一致するパターンを指定された置換ストリングに置き換えることができます。

var str:String = "She sells seashells by the seashore."; 
var pattern:RegExp = /sh/gi; 
trace(str.replace(pattern, "sch")); //sche sells seaschells by the seaschore. 

この例では、 i ignoreCase )フラグが正規表現で設定されているので、一致する文字列は大文字と小文字を区別せず、 g global )フラグが設定されているので、複数の一致が置き換えられます。詳しくは、 正規表現の使用 を参照してください。

置換ストリングには、次の $ 置換コードを含めることができます。 $ 置換コードを記述した位置には、次の表に示す置換テキストが挿入されます。

$ コード

置換テキスト

$$

$

$&

パターンに一致したサブストリング

$`

ストリングのうち、パターンに一致したサブストリングより前にある部分。 このコードで使用する記号は、曲がっていない左側一重引用符( ` )です。垂直の一重引用符( ' )や、曲がった左側一重引用符( ' )ではありません。

$'

ストリングのうち、パターンに一致したサブストリングより後にある部分。 このコードで使用する記号は、垂直の一重引用符( ' )です。

$ n

パターン内のグループ化括弧によってキャプチャされた n 番目のサブストリング。n は 1 桁の数字(1 ~ 9)であり、$n の後に 10 進数字は続きません。

$ nn

括弧指定されたグループの nn 番目にキャプチャされた一致です。 nn は 2 桁の 10 進数字(01 ~ 99)です。 nn 番目のキャプチャが未定義の場合、置換テキストは空のストリングになります。

例えば、次の例は、1 番目および 2 番目に一致したキャプチャグループを表す $2 および $1 置換コードを使用する方法を示しています。

var str:String = "flip-flop"; 
var pattern:RegExp = /(\w+)-(\w+)/g; 
trace(str.replace(pattern, "$2-$1")); // flop-flip

replace() メソッドの第 2 パラメーターには関数を指定することもできます。その場合は、一致したテキストが、指定した関数の戻り値によって置換されます。

var str:String = "Now only $9.95!"; 
var price:RegExp = /\$([\d,]+.\d+)+/i; 
trace(str.replace(price, usdToEuro)); 
 
function usdToEuro(matchedSubstring:String,                                  capturedMatch1:String,                                  index:int,                                  str:String):String 
{ 
    var usd:String = capturedMatch1; 
    usd = usd.replace(",", ""); 
    var exchangeRate:Number = 0.853690; 
    var euro:Number = parseFloat(usd) * exchangeRate; 
    const euroSymbol:String = String.fromCharCode(8364); 
    return euro.toFixed(2) + " " + euroSymbol; 
}

replace() メソッドの 2 番目のパラメーターとして関数を使用する場合、次の引数が関数に渡されます。

  • ストリング内の一致する部分。

  • グループ化括弧によってキャプチャされる一致。 この方法で渡される引数の数は、括弧内のパターンとの一致数によって異なります。 括弧内のパターンとの一致数は、関数コード内の arguments.length - 3 を確認して特定することができます。

  • ストリング内で一致部分が始まる場所のインデックス位置。

  • ストリング全体。