web-dev-qa-db-fra.com

Comment extraire une chaîne en utilisant JavaScript Regex?

J'essaie 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 veux 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);
}
116
PapelPincel

Vous devez utiliser le mflag :

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

Mettez aussi le * dans la bonne place:

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

Vous avez besoin de ces changements:

  • Mettez le * entre les parenthèses, comme suggéré ci-dessus. Sinon, votre groupe ne contiendra qu'un seul caractère.

  • Débarasse-toi du ^ 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. Correspond à la nouvelle ligne explicite.

  • Je suppose que vous voulez le groupe correspondant (ce qui est dans 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.

90
j-g-faustus

Votre expression régulière veut probablement être

/\nSUMMARY:(.*)$/g

Un petit truc 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'obtiendrez pas d'erreurs de type gênantes lorsque vous utiliserez arr

17
barkmadley

(.*) 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 à la :.

6
Tim Pietzcker