Najděte řetězce v uvozovkách
Vytvořte regulární výraz, který najde řetězce ve dvojitých uvozovkách "...".
Řetězce by měly podporovat únikové znaky stejným způsobem, jako řetězce v JavaScriptu. Například uvozovky mohou být vloženy jako \", nový řádek jako \n a samotné zpětné lomítko jako \\.
let řetězec = "Tak jako \"tady\".";
Prosíme všimněte si, že uvozovky za únikovým znakem \" neukončují řetězec.
Měli bychom tedy hledat od prvních uvozovek ke druhým, ale po cestě ignorovat uvozovky za únikovým znakem.
To je klíčová součást úlohy, jinak by byla triviální.
Příklady řetězců, které se mají shodovat:
.. "otestuj mě" ..
.. "Řekni \"Ahoj\"!" ... (uvozovky s únikovým znakem uvnitř)
.. "\\" .. (dvojité lomítko uvnitř)
.. "\\ \"" .. (dvojité lomítko a uvozovky s únikovým znakem uvnitř)
Abychom v JavaScriptu správně předali do řetězce zpětná lomítka, musíme je zdvojit, například:
let řetězec = ' .. "otestuj mě" .. "Řekni \\"Ahoj\\"!" .. "\\\\ \\"" .. ';
// řetězec v paměti
alert(řetězec); // .. "otestuj mě" .. "Řekni \"Ahoj\"!" .. "\\ \"" ..
Řešení: /"(\\.|[^"\\])*"/g.
Krok za krokem:
- Nejprve najdeme otevírací uvozovky
". - Potom, pokud máme zpětné lomítko
\\(ve vzoru je musíme zdvojit, protože je to speciální znak), pak za ním může být jakýkoli znak (tečka). - V opačném případě přijmeme libovolný znak kromě uvozovek (ty znamenají konec řetězce) a zpětného lomítka (abychom zabránili osamoceným zpětným lomítkům, zpětné lomítko se používá jen s jiným symbolem za sebou):
[^"\\] - …A tak dále až do uzavíracích uvozovek.
V akci:
let rv = /"(\\.|[^"\\])*"/g;
let řetězec = ' .. "otestuj mě" .. "Řekni \\"Ahoj\\"!" .. "\\\\ \\"" .. ';
alert( řetězec.match(rv) ); // "otestuj mě","Řekni \"Ahoj\"!","\\ \""