torna alle lezioni

Trovate le stringhe tra doppi apici

Create una regexp per trovare le stringhe tra doppi apici "...".

Le stringhe dovrebbero supportare l’escape allo stesso modo delle stringhe JavaScript. Per esempio, i doppi apici possono essere inseriti come \" una nuova linea come \n, e lo stesso slash come \\.

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

Si noti che, in particolare, un doppio apice con escape \" non termina una stringa.

Noi dovremmo cercare, pertanto, da un doppio apice fino all’altro ignorando quelli con escape tra i due.

Questo è la parte fondamentale dell’esercitazione, altrimenti diventerebbe banale.

Ecco degli esempi di stringhe che corrispondono:

.. "test me" ..
.. "Say \"Hello\"!" ... (contiene doppi apici con escape)
.. "\\" ..  (contiene un doppio slash)
.. "\\ \"" ..  (contiene un doppio slash e un doppio apice con escape)

In JavaScript abbiamo bisogno di raddoppiare lo slash per passarli correttamente all’interno della stringa, in questo modo:

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

// la stringa in memoria
alert(str); //  .. "test me" .. "Say \"Hello\"!" .. "\\ \"" ..

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

Passo dopo passo:

  • Innanzitutto cerchiamo un doppio apice di apertura "
  • Quindi se abbiamo un backslash \\ (dobbiamo raddoppiarlo nel pattern perché è un carattere speciale), qualsiasi carattere dopo di esso è consentito (il punto).
  • Altrimenti consideriamo ogni carattere eccetto un doppio apice (che significherebbe la fine della stringa) ed un backslash (per evitare backslashe isolati, il backslash è usato soltanto in congiunzione con altri simboli dopo di esso): [^"\\]
  • …e così via fino al doppio apice di chiusura.

In azione:

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

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