174

JavaScript正規表現を使用してファイルから部分文字列を抽出しようとしています。これがファイルからのスライスです:

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);
}
4

7 に答える 7

132
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) は機能します。

于 2009-11-10T12:34:01.823 に答える
107

m 次のフラグを使用する必要があります。

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

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

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
于 2009-11-10T13:18:11.430 に答える
26

あなたの正規表現はおそらくなりたいです

/\nSUMMARY:(.*)$/g

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

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

これにより、使用するときに煩わしいタイプエラーが発生しなくなります。arr

于 2009-11-10T12:36:51.067 に答える
9

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

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

于 2009-11-10T11:32:18.100 に答える
-1

これは、JavaScriptでiCalファイルを解析する方法です

    function calParse(str) {

        function parse() {
            var obj = {};
            while(str.length) {
                var p = str.shift().split(":");
                var k = p.shift(), p = p.join();
                switch(k) {
                    case "BEGIN":
                        obj[p] = parse();
                        break;
                    case "END":
                        return obj;
                    default:
                        obj[k] = p;
                }
            }
            return obj;
        }
        str = str.replace(/\n /g, " ").split("\n");
        return parse().VCALENDAR;
    }

    example = 
    'BEGIN:VCALENDAR\n'+
    'VERSION:2.0\n'+
    'PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n'+
    'BEGIN:VEVENT\n'+
    'DTSTART:19970714T170000Z\n'+
    'DTEND:19970715T035959Z\n'+
    'SUMMARY:Bastille Day Party\n'+
    'END:VEVENT\n'+
    'END:VCALENDAR\n'


    cal = calParse(example);
    alert(cal.VEVENT.SUMMARY);
于 2009-11-10T13:04:49.007 に答える