Weźmy ten plik z mojego projektu:
https://github.com/andrzejlisek/MusicScoreViewer/blob/master/pdf.js
Ja nie jestem autorem tego pliku, jest to nie najnowsza wersja biblioteki wyświetlającej PDF w JavaScript.
W tym pliku jest taki zapis /^[a-z]:[/\\]/i
(linia 12996).
Jak to należy rozumieć? Z tego, co wiem, w Javascript, regex zaczyna się i kończy się znakiem /
, a każdy znak tekstowy, który może pełnić funkcję specjalną (czyli między innymi /
) musi być poprzedzony znakiem \
. Tutaj jest od razu znak /
, ale interpreter JavaScript jakimś cudem nie próbuje tego zinterpretować jako koniec wyrażenia. Taki sposób to tylko zamiennik zapisu new RegExp(somepattern)
.
Jak należy interpretować to wyrażenie? Ja rozumiem, że musi zaczynać się od jednej małej litery, potem musi nastapić dwukroper, a za dwukropkiem \
, jednak za tymi trzema znakami może być cokolwiek. Mówiąc po ludzku, do tego wyrażenia pasuje każda pełna ścieżka dostępu z Windows przy literze dysku zapisanej małą literą. Rozumiem, że znak \
musi być zapisany podwójnie, bo pierwszy to nie jest znak wyrażenia, tylko wskazanie, że następny znak należy zinterpretować jako tekst. Ale po co jest tu znak /
?
Znalazłem https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_regexp i przerobiłem przykładowy kod do testów:
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Regular Expressions</h2>
<p>Do a case-insensitive search for "w3schools" in a string:</p>
<p id="demo"></p>
<script>
let pattern1 = /^[a-z]:[/\\]/i;
let pattern2 = new RegExp("^[a-z]:[/\\\\]", "i");
alert(pattern1);
alert(pattern2);
if (pattern1 == pattern2)
{
alert("to samo 1");
}
else
{
alert("rozne 1");
}
if (pattern1 === pattern2)
{
alert("to samo 2");
}
else
{
alert("rozne 2");
}
</script>
</body>
</html>
Jak widać, pokazuje się dwa razy taki sam tekst, ale też pokazuje się "rozne 1" i "rozne 2". Jak powinien być napisany parametr w konstruktorze obiektu RegExp
, żeby JaavaScript zinterpretował jako identyczny z omawianym zapisem z ukośnikami?