retour au cours

Trouver les chaines de caractère

Créer une regexp pour trouver les chaines de caractère entre guillemets doubles "...".

La chaine de caractère devrait supporter l’échappement, comme les chaines de caractère JavaScript. Par exemple, des guillemets peuvent être insérés comme ceci \" une nouvelle ligne comme \n, et un antislash comme \\.

let str = "Just like \"here\".";

Veuillez noter qu’une guillemet échapée \" ne termine pas une chaine de caractère.

Nous devrions donc chercher une guillemet puis la suivante en ignorant celles échapées.

C’est la partie essentielle de la tâche, à part cela, cela devrait être simple.

Exemple de chaine de caractère valides :

.. "test me" ..
.. "Say \"Hello\"!" ... (guillemets échapées à l'intérieur)
.. "\\" ..  (double backslash à l'intérieur)
.. "\\ \"" ..  (double backslash et guillemets échapées à l'intérieur)

En JavaScript nous devons doubler les slash pour les placer dans la chaine de caractère, comme ceci :

let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';

// the in-memory string
alert(str); //  .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..

La solution : /"(\\.|[^"\\])*"/g.

Etape par etape :

  • D’abord nous recherchons une guillemet ouvrante "
  • Ensuite si nous avons un antislash \\ (puisque c’est un caractère spécial nous devons le doubler, mais dans les faits c’est un unique antislash), alors n’importe quel caractère peut se trouver à sa suite (un point).
  • Sinon nous prenons n’importe quel caractère à part une guillemet (cela signifierait la fin de la chaine de caractère) et un antislash (pour empêcher les antislash solitaires, un antislash est seulement utilisé avec un autre symbole après lui): [^"\\]
  • …Et on continue jusqu’à atteindre la guillemet fermante.

En action :

let regexp = /"(\\.|[^"\\])*"/g;
let str = ' .. "test me" .. "Say \\"Hello\\"!" .. "\\\\ \\"" .. ';

alert( str.match(regexp) ); // "test me","Say \"Hello\"!","\\ \""