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


133

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

DATE:20091201T220000
SUMMARY:Dad's birthday

抽出したいフィールドは「概要」です。ここにアプローチがあります:

extractSummary : function(iCalContent) {
  /*
  input : iCal file content
  return : Event summary
  */
  var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
  return(arr);
}

回答:


88

m フラグを使用する必要があります:

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

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

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|

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


1
これを@barkmadleyと組み合わせると|| [null, null]、一致が失敗した場合はarrnullになりarr[1]、例外がスローされます
Kunal

22

あなたの正規表現は

/\nSUMMARY:(.*)$/g

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

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

これにより、使い始めたときに煩わしいタイプのエラーが発生しなくなります arr


2
match一致し
Kunal

7

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

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


-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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.