正規表現の例:Wiki パーサー

Flash Player 9 以降、Adobe AIR 1.0 以降

この単純な Wiki テキスト変換の例で、正規表現の使用方法をいくつか示します。

  • ソースの Wiki パターンに一致するテキスト行を適切な HTML 出力ストリングに変換する。

  • 正規表現を使用して、URL パターンを HTML の <a> ハイパーリンクタグに変換する。

  • 正規表現を使用して、米ドルストリング(「 $9.95 」など)をユーロストリング(「 8.24 € 」など)に変換する。

このサンプルのアプリケーションのファイルを入手するには、 www.adobe.com/go/learn_programmingAS3samples_flash_jp を参照してください。 WikiEditor アプリケーションのファイルは、Samples/WikiEditor フォルダーにあります。 このアプリケーションは次のファイルで構成されています。

ファイル

説明

WikiEditor.mxml

または

WikiEditor.fla

Flash(FLA)または Flex(MXML)のメインアプリケーションファイル。

com/example/programmingas3/regExpExamples/WikiParser.as

正規表現を使用して Wiki 入力テキストパターンを同等の HTML 出力に変換するメソッドが含まれているクラス。

com/example/programmingas3/regExpExamples/URLParser.as

正規表現を使用して URL ストリングを HTML の <a> ハイパーリンクタグに変換するメソッドが含まれているクラス。

com/example/programmingas3/regExpExamples/CurrencyConverter.as

正規表現を使用して米ドルストリングをユーロストリングに変換するメソッドが含まれているクラス。

WikiParser クラスの定義

WikiParser クラスには、Wiki 入力テキストを同等の HTML 出力に変換するメソッドが含まれます。 この Wiki 変換アプリケーションは堅牢ではありませんが、パターンマッチングおよびストリング変換を行う正規表現の使用方法を示します。

コンストラクター関数は setWikiData() メソッドと共に、Wiki 入力テキストのサンプルストリングを次のように単純に初期化します。

public function WikiParser() 
{ 
    wikiData = setWikiData(); 
}

ユーザーがサンプルアプリケーションの「Test」ボタンをクリックすると、アプリケーションは WikiParser オブジェクトの parseWikiString() メソッドを呼び出します。このメソッドは、他の複数のメソッドを呼び出し、結果の HTML ストリングを組み立てます。

public function parseWikiString(wikiString:String):String 
{ 
    var result:String = parseBold(wikiString); 
    result = parseItalic(result); 
    result = linesToParagraphs(result); 
    result = parseBullets(result); 
    return result; 
}

呼び出されるメソッド( parseBold() parseItalic() linesToParagraphs() 、および parseBullets() )は、入力 Wiki テキストを HTML 形式のテキストに変換するために、ストリングの replace() メソッドを使用して、正規表現で定義された一致パターンを置き換えます。

ボールドおよびイタリックのパターンの変換

parseBold() メソッドは、Wiki のボールドテキストパターン( '''foo''' など)を探し、次のように、同等の HTML( <b>foo</b> など)に変換します。

private function parseBold(input:String):String 
{ 
    var pattern:RegExp = /'''(.*?)'''/g; 
    return input.replace(pattern, "<b>$1</b>"); 
}

正規表現の (.?*) の部分は、2 つの定義パターン ''' の間にある任意の数の文字( * )に一致することに注意してください。 ? 繰り返し制御文字を使用すると、最短一致でマッチングが行われます。そのため、 '''aaa''' bbb '''ccc''' のようなストリングの場合、最初に一致するストリングは '''aaa''' になります。 ''' パターンで開始し、終了するストリング全体ではありません。

正規表現内の括弧は、キャプチャグループを定義します。 replace() メソッドは、置換ストリングの $1 コードを使用して、このグループを参照します。正規表現の g global )フラグによって、 replace() メソッドは(最初の 1 つだけではなく)ストリング内のすべての一致を置き換えます。

parseItalic() メソッドは parseBold() メソッドと同じように動作しますが、イタリックテキストの区切り記号として 2 つのアポストロフィ( '' )を探します(3 つではありません)。

private function parseItalic(input:String):String 
{ 
    var pattern:RegExp = /''(.*?)''/g; 
    return input.replace(pattern, "<i>$1</i>"); 
}

箇条書きパターンの変換

次の例で示すように、 parseBullet() メソッドは Wiki の箇条書き行パターン( * foo など)を探し、同等の HTML( <li >foo</li> など)に変換します。

private function parseBullets(input:String):String 
{ 
    var pattern:RegExp = /^\*(.*)/gm; 
    return input.replace(pattern, "<li>$1</li>"); 
}

正規表現の先頭の ^ 記号は、行の先頭に一致します。正規表現で m multiline )フラグを使用した場合、 ^ 記号は、単純にストリングの先頭ではなく、行頭とマッチングされます。

¥* パターンは、アスタリスク文字に一致します( * 繰り返し制御文字ではなく、リテラルのアスタリスクであることを示すために、円記号を使用します)。

正規表現内の括弧は、キャプチャグループを定義します。 replace() メソッドは、置換ストリングの $1 コードを使用して、このグループを参照します。正規表現の g global )フラグによって、 replace() メソッドは(最初の 1 つだけではなく)ストリング内のすべての一致を置き換えます。

Wiki 段落パターンの変換

linesToParagraphs() メソッドは、入力 Wiki ストリングの各行を HTML の <p> 段落タグに変換します。メソッド内の次の行によって、入力 Wiki ストリングから空の行を削除します。

var pattern:RegExp = /^$/gm; 
var result:String = input.replace(pattern, "");

正規表現の ^ 記号は行の先頭に一致し、 $ 記号は行の末尾に一致します。正規表現で m multiline )フラグを使用した場合、^ 記号は、単純にストリングの先頭ではなく、行頭とマッチングされます。

replace() メソッドは、すべての一致するサブストリング(空の行)を空のストリング( "" )で置き換えます。正規表現の g global )フラグによって、 replace() メソッドは(最初の 1 つだけではなく)ストリング内のすべての一致を置き換えます。

URL から HTML の <a > タグへの変換

ユーザーがサンプルアプリケーションの「Test」ボタンをクリックしたとき、「 urlToATag 」チェックボックスがオンであると、アプリケーションは URLParser.urlToATag() 静的メソッドを呼び出して、入力 Wiki ストリングの URL ストリングを HTML の <a> タグに変換します。

var protocol:String = "((?:http|ftp)://)"; 
var urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; 
var optionalUrlPart:String = "(\.[a-z0-9_-]*)"; 
var urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); 
var result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");

RegExp() コンストラクター関数を使用して、複数の要素部分から得られた正規表現を組み立てます( urlPattern )。これらの要素部分は、正規表現パターンの一部を定義するストリングです。

正規表現パターンの最初の部分は、 protocol ストリングで定義され、URL プロトコル( http:// または ftp:// )を定義します。括弧は ? 記号で示され、非キャプチャグループを定義します。これは、括弧が | 選択制御パターン用のグループの定義にのみ使用されるという意味です。このグループは replace() メソッドの置換ストリングの後方参照コード( $1 $2 $3 )に一致しません。

正規表現のその他の要素部分は、それぞれキャプチャグループを使用し(パターン内の括弧で示されます)、 replace() メソッドの置換ストリングの後方参照コード( $1 $2 $3 )で使用されます。

urlPart ストリングで定義されたパターン部分は、文字 a z 0 9 、_ または - の 1 つ以上に一致します。 + 繰り返し制御文字は、少なくとも 1 つの文字に一致することを示します。 ¥. は、必要なドット( . )文字を指定します。 残りは、文字 a ~ z 0 ~ 9 _ または - の 1 つ以上で構成される別のストリングに一致します。

optionalUrlPart ストリングで定義されたパターン部分は、0 個以上の任意の数の英数字文字( _ - を含む)が続くドット( . )文字に一致します。 * 繰り返し制御文字は、0 個以上の文字が一致することを示します。

replace() メソッドの呼び出しでは、正規表現を使用し、後方参照を使用して置換 HTML ストリングが組み立てられます。

urlToATag() メソッドは、次に emailToATag() メソッドを呼び出します。このメソッドは、似た手法を使用して、電子メールパターンを HTML の <a> ハイパーリンクストリングに置き換えます。このサンプルファイルで HTTP、FTP、および電子メールの URL とのマッチングに使用する正規表現は、例を示すことが目的なので単純化されています。より正確にこれらの URL とマッチングするには、より複雑な正規表現を使用します。

米ドルストリングからユーロストリングへの変換

ユーザーがサンプルアプリケーションの「Test」ボタンをクリックしたとき、「 dollarToEuro 」チェックボックスがオンであると、アプリケーションは CurrencyConverter.usdToEuro() 静的メソッドを呼び出して、次のように米ドルストリング(「 $9.95 」など)をユーロストリング(「 8.24 € 」など)に変換します。

var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; 
return input.replace(usdPrice, usdStrToEuroStr); 

最初の行で、米ドルストリングに一致する単純なパターンを定義します。 $ 文字の前に円記号( ¥ )エスケープ文字が付いていることに注意してください。

replace() メソッドは、正規表現を使用してパターンマッチングを行い、 usdStrToEuroStr() 関数を呼び出して置換ストリング(ユーロでの値)を決定します。

関数名を replace() メソッドの第 2 パラメーターとして使用すると、次の要素がパラメーターとして呼び出し元関数に渡されます。

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

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

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

  • ストリング全体。

usdStrToEuroStr() メソッドは、次のように米ドルストリングパターンをユーロストリングに変換します。

private function usdToEuro(...args):String 
{ 
    var usd:String = args[1]; 
    usd = usd.replace(",", ""); 
    var exchangeRate:Number = 0.828017; 
    var euro:Number = Number(usd) * exchangeRate; 
    trace(usd, Number(usd), euro); 
    const euroSymbol:String = String.fromCharCode(8364); // € 
    return euro.toFixed(2) + " " + euroSymbol;  
}

args[1] は、 usdPrice 正規表現に一致した、キャプチャされた括弧指定グループを表します。これは、米ドルストリングの数字部分です。すなわち、 $ 記号が付いていない金額です。メソッドは、為替レート変換を適用し、結果のストリングを返します(前に $ 記号を付ける代わりに、後ろに € 記号を付けます)。