web-dev-qa-db-ja.com

JavaScript Regexを使用して文字列を抽出する方法は?

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);
}
116
PapelPincel

mflag を使用する必要があります。

マルチライン;開始文字と終了文字(^および$)を複数行にわたって機能するものとして扱います(つまり、入力文字列全体の最初または最後だけでなく、各行の最初または最後に一致します(\ nまたは\ rで区切られます))

*も適切な場所に配置します。

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
78
Salman A
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)は機能します。

90
j-g-faustus

あなたの正規表現はおそらく

/\nSUMMARY:(.*)$/g

私が使用したい便利な小さなトリックは、配列と一致するデフォルトの割り当てです。

var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];

このようにすると、arrを使用するときに迷惑なタイプエラーが発生しなくなります。

17
barkmadley

(.*)の代わりに(.)*が開始されます。後者は、行の最後の文字のみをキャプチャします。

また、:をエスケープする必要はありません。

6
Tim Pietzcker