176 votes

Comment extraire une chaîne de caractères à l'aide de JavaScript Regex ?

J'essaie d'extraire une sous-chaîne d'un fichier avec JavaScript Regex. Voici une sous-chaîne 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);
}

134voto

j-g-faustus Points 4315
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

Vous avez besoin de ces changements :

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

  • Débarrassez-vous de la ^ y $ . 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. La correspondance se fait plutôt sur les nouvelles lignes explicites.

  • Je suppose que vous voulez le groupe correspondant (ce qui est à l'intérieur des parenthèses) plutôt que plutôt que le tableau complet ? arr[0] est le match complet ( "\nSUMMARY:..." ) et les index suivants contiennent le groupe correspond.

  • String.match(regexp) est censé retourner un tableau avec les correspondantes. Dans mon navigateur, ce n'est pas le cas (Safari sur Mac renvoie uniquement la correspondance complète complet, pas les groupes), mais Regexp.exec(string) fonctionne.

107voto

Salman A Points 60620

Vous devez utiliser le m drapeau :

multiline ; traiter les caractères de début et de fin (^ et $) comme des caractères de travail comme s'ils travaillaient sur plusieurs lignes (c'est-à-dire qu'ils correspondent au début ou à la fin de chaque ligne). (délimitée par \n o \r ), et pas seulement le tout début ou la fin de la chaîne d'entrée entière)

Mettez également le * au bon endroit :

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

26voto

barkmadley Points 3526

Votre expression régulière veut très probablement être

/\nSUMMARY:(.*)$/g

Une petite astuce utile que j'aime utiliser consiste à 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 manière, vous n'obtiendrez pas d'erreurs de type ennuyeuses lorsque vous utiliserez arr

9voto

Tim Pietzcker Points 146308

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

De même, il n'est pas nécessaire d'échapper à la : .

6voto

guidamedia Points 81

Ce code fonctionne :

let str = "governance[string_i_want]"; 
let res = str.match(/[^governance\[](.*)[^\]]/g);
console.log(res);

res sera égal à "string_i_want". Cependant, dans cet exemple, res est toujours un tableau, il ne faut donc pas traiter res comme une chaîne de caractères.

En regroupant les caractères que je ne veux pas, en utilisant [^string], et en faisant correspondre ce qui se trouve entre les crochets, le code extrait la chaîne que je veux !

Vous pouvez l'essayer ici : https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_match_regexp

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X