JavaScript Regexを使用してファイルから部分文字列を抽出しようとしています。ファイルからのスライスは次のとおりです。
DATE:20091201T220000
SUMMARY:Dad's birthday
抽出するフィールドは「Summary」です。アプローチは次のとおりです。
extractSummary : function(iCalContent) {
/*
input : iCal file content
return : Event summary
*/
var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
return(arr);
}
m
flag を使用する必要があります。
マルチライン;開始文字と終了文字(^および$)を複数行にわたって機能するものとして扱います(つまり、入力文字列全体の最初または最後だけでなく、各行の最初または最後に一致します(\ nまたは\ rで区切られます))
*
も適切な場所に配置します。
"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------|
function extractSummary(iCalContent) {
var rx = /\nSUMMARY:(.*)\n/g;
var arr = rx.exec(iCalContent);
return arr[1];
}
次の変更が必要です。
上記のように、*
を括弧内に入れます。それ以外の場合、一致するグループには1文字のみが含まれます。
^
と$
を取り除きます。グローバルオプションを使用すると、行の開始と終了ではなく、文字列全体の開始と終了で一致します。代わりに明示的な改行で一致します。
完全な配列ではなく、一致するグループ(括弧内の内容)が必要だと思いますか? arr[0]
は完全一致("\nSUMMARY:..."
)であり、次のインデックスにはグループ一致が含まれます。
String.match(regexp)は、一致した配列を返すことになっています。私のブラウザでは(MacではSafariはグループではなく完全一致のみを返します)、Regexp.exec(string)は機能します。
あなたの正規表現はおそらく
/\nSUMMARY:(.*)$/g
私が使用したい便利な小さなトリックは、配列と一致するデフォルトの割り当てです。
var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];
このようにすると、arr
を使用するときに迷惑なタイプエラーが発生しなくなります。
(.*)
の代わりに(.)*
が開始されます。後者は、行の最後の文字のみをキャプチャします。
また、:
をエスケープする必要はありません。