Wie extrahiere ich einen String mit JavaScript Regex?

133

Ich versuche, mit JavaScript Regex einen Teilstring aus einer Datei zu extrahieren. Hier ist ein Ausschnitt aus der Datei:

DATE:20091201T220000
SUMMARY:Dad's birthday

Das Feld, das ich extrahieren möchte, ist "Zusammenfassung". Hier ist der Ansatz:

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

Antworten:

88

Sie müssen die m Flagge verwenden :

mehrzeilig; Behandeln Sie Anfangs- und Endzeichen (^ und $) so, dass sie über mehrere Zeilen arbeiten (dh mit dem Anfang oder Ende jeder Zeile (begrenzt durch \ n oder \ r) übereinstimmen, nicht nur mit dem Anfang oder Ende der gesamten Eingabezeichenfolge).

Stellen Sie das auch *an die richtige Stelle:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
Salman A.
quelle
97
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

Sie benötigen diese Änderungen:

  • Setzen Sie das *Innere wie oben vorgeschlagen in die Klammer. Andernfalls enthält Ihre übereinstimmende Gruppe nur ein Zeichen.

  • Werde das ^und los $. Mit der globalen Option stimmen sie am Anfang und am Ende der vollständigen Zeichenfolge überein und nicht am Anfang und Ende der Zeilen. Passen Sie stattdessen an explizite Zeilenumbrüche an.

  • Ich nehme an, Sie möchten die passende Gruppe (was steht in der Klammer) und nicht das vollständige Array? arr[0]ist die vollständige Übereinstimmung ( "\nSUMMARY:...") und die nächsten Indizes enthalten die Gruppenübereinstimmungen.

  • String.match (regexp) soll ein Array mit den Übereinstimmungen zurückgeben. In meinem Browser funktioniert dies nicht (Safari auf Mac gibt nur die vollständige Übereinstimmung zurück, nicht die Gruppen), aber Regexp.exec (Zeichenfolge) funktioniert.

jg-faustus
quelle
1
Ich würde dies mit @barkmadleys kombinieren, || [null, null]da wenn das Match fehlschlägt, arrnull arr[1]wäre und eine Ausnahme auslösen würde
Kunal
22

Ihr regulärer Ausdruck möchte höchstwahrscheinlich sein

/\nSUMMARY:(.*)$/g

Ein hilfreicher kleiner Trick, den ich gerne verwende, ist die Standardzuweisung bei Übereinstimmung mit einem Array.

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

Auf diese Weise erhalten Sie keine störenden Tippfehler, wenn Sie zur Verwendung gehen arr

Barkmadley
quelle
2
matchgibt eine Null zurück, wenn es keine Übereinstimmung gibt
Kunal
7

(.*)statt (.)*wäre ein Anfang. Letzteres erfasst nur das letzte Zeichen in der Zeile.

Auch keine Notwendigkeit, dem zu entkommen :.

Tim Pietzcker
quelle
-1

So können Sie iCal-Dateien mit Javascript analysieren

    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);
user187291
quelle