Comment extraire une chaîne en utilisant JavaScript Regex?

133

J'essaye d'extraire une sous-chaîne d'un fichier avec JavaScript Regex. Voici une tranche du fichier:

DATE:20091201T220000
SUMMARY:Dad's birthday

le champ que je souhaite extraire est "Résumé". Voici l'approche:

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

Réponses:

88

Vous devez utiliser le m drapeau :

multiligne; traiter les caractères de début et de fin (^ et $) comme travaillant sur plusieurs lignes (c'est-à-dire correspondre au début ou à la fin de chaque ligne (délimitée par \ n ou \ r), pas seulement le tout début ou la fin de toute la chaîne d'entrée)

Mettez également le *au bon endroit:

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

Vous avez besoin de ces changements:

  • Mettez l' *intérieur de la parenthèse comme suggéré ci-dessus. Sinon, votre groupe correspondant ne contiendra qu'un seul caractère.

  • Débarrassez-vous des fichiers ^et $. Avec l'option globale, ils correspondent au début et à la fin de la chaîne complète, plutôt qu'au début et à la fin des lignes. Match sur les nouvelles lignes explicites à la place.

  • Je suppose que vous voulez le groupe correspondant (ce qui est à l'intérieur de la parenthèse) plutôt que le tableau complet? arr[0]est la correspondance complète ( "\nSUMMARY:...") et les index suivants contiennent les correspondances de groupe.

  • String.match (regexp) est censé renvoyer un tableau avec les correspondances. Dans mon navigateur, ce n'est pas le cas (Safari sur Mac ne renvoie que la correspondance complète, pas les groupes), mais Regexp.exec (chaîne) fonctionne.

jg-faustus
la source
1
Je combinerais cela avec @barkmadley || [null, null]car si le match échoue, arrserait nul et arr[1]lancerait une exception
Kunal
22

Votre expression régulière veut probablement être

/\nSUMMARY:(.*)$/g

Une petite astuce utile que j'aime utiliser est d'assigner par défaut une correspondance avec un tableau.

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

De cette façon, vous n'obtenez pas d'erreurs de type gênantes lorsque vous utilisez arr

barkmadley
la source
2
matchrenvoie un null s'il n'y a pas de correspondance
Kunal
7

(.*)au lieu de (.)*serait un début. Ce dernier ne capturera que le dernier caractère de la ligne.

En outre, pas besoin d'échapper au :.

Tim Pietzcker
la source
-1

voici comment vous pouvez analyser les fichiers iCal avec javascript

    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
la source