0

JavaScript を使用して iCalendar ファイルからいくつかのパラメーターを読み取りたいと思います。

ファイル入力は次のようになります。

BEGIN:VEVENT DTSTART:20121127T190000Z DTEND:20121127T210000Z DTSTAMP:20121130T185808Z UID:q4sbrtajjol1hlpiijpho5jac0@google.com CREATED:20121102T191519Z 説明:1. ブンデスリーガ\、14. Spieltag \n\nhttp://www.fussball-spielplan. info LAST-MODIFIED:20121127T211459Z LOCATION:Commerzbank-Arena\, Frankfurt SEQUENCE:10 STATUS:CONFIRMED 概要:Eintracht Frankfurt - 1. FSV Mainz 05 (1:3) TRANSP:TRANSPARENT END:VEVENT

パラメータタグは次のとおりです。

DTSTART:
DTEND:
DTSTAMP:
UID:
CREATED:
DESCRIPTION:
LAST-MODIFIED:
LOCATION:
STATUS:
SUMMARY:
TRANSP:

これらのパラメーターの背後にある値を読み取りたい。値の長さはほとんど可変です。

RegExp現在、区切り文字として何を設定すればよいかわからないため 、 a の使用は非常に困難です。"\n"すべてのテキスト部分がスペースで区切られているため、機能しません。しかし、スペース区切り文字を使用する"\s"と、単語ごとに区切られます。これは、特にDESCRIPTION:長いテキストが含まれるパラメーターの場合、望ましい結果ではありません。

私のソースコードは現在次のようになっています。

file_reader.onload = function (evt) {
document.getElementById("filedrag").textContent = evt.target.result;

Output(
    "<p>File information: <strong>" + file.name +
    "</strong> type: <strong>" + file.type +
    "</strong> size: <strong>" + file.size +
    "</strong> bytes</p>");

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 
var file_content = evt.target.result;
var match, matches = [];

while ((match = regexp.exec(file_content)) != null) {
    matches.push(match.index);
}

alert(matches);
}

どうすれば自分のアイデアを実現できますか?

4

2 に答える 2

2

あなたのコードにはあなたが持っています

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 

/ただし、コンストラクターに文字列を渡す場合、正規表現の区切り文字は必要ありませんRegExp。一致する文字として解釈されます。また、その文字列として、特別な正規表現文字はダブルエスケープする必要があるため\s\\s

指定された各タグの値を取得する1つの方法は次のとおりです。

var match,
    matches = [],
    tags = 'DTSTART|DTEND|DTSTAMP|UID|CREATED|DESCRIPTION|' +
           'LAST-MODIFIED|LOCATION|STATUS|SUMMARY|TRANSP',
    regexp = new RegExp( '(?:' +  tags + '):([\\s\\S]*?)(?=\\s+(?:' +
                                  tags + '|SEQUENCE|END):)', 'g' );   

while ( match = regexp.exec( file_content ) ) {
    matches.push( match[1] );
}

各tag:valueペアを取得する場合は、に変更match[1]match[0]ます。

上記は、各タグの前に少なくとも1つのスペースまたは改行文字があることを前提としています。
また、スペースとそれに続くタグ名とそれに続くa:は、どのタグの値にも表示されないことを前提としています。

[\\s\\S]代わりに.、改行文字をタグの値に含めることができるように使用されます。

上記はSEQUENCE、リストで指定されていないため、タグの値をキャプチャしません。
キャプチャしたい場合は、追加しtagsたり削除したりするだけで、regexp'|SEQUENCE|END):)'なり'|END):)'ます。

または:

var m,
    params = {},
    rex = /([A-Z-]+):([\s\S]*?)(?=\s+[A-Z-]+:|$)/g;   

while ( m = rex.exec( file_content ) ) {
    params[ m[1] ] = m[2];
}

console.log( params["DTSTART"] );    // 20121127T190000Z
于 2013-02-16T17:11:03.293 に答える
1
var params={};
fileContent.replace(/([\w-]+):([^:]+)\s/g,function($0,$1,$2){params[$1]=$2;});

上記の正規表現は、次のことを前提としています。

  • パラメータは、コロンが続く単一の単語(スペースなし)です([\w-]+):
  • 値にコロンが含まれていない([^:]+)

値 (説明テキストなど) にコロンを含めることができる場合は、パラメーターについてより具体的にする必要があります (@MikeM の回答を参照)。

ライブデモ: http://jsfiddle.net/zhsLJ/

于 2013-02-16T17:46:00.393 に答える