Сокращения класса символов, такие как \w
, \d
и \s
, означают те же самые внутренние классы символов, что и out, но метасимволы, такие как .
, обычно теряют свои специальные значения внутри классов символов. Вот почему /<!--[.]*-->/
не сработал, как вы ожидали: [.]
соответствует литералу .
.
Но /<!--.*-->/
на самом деле тоже не работает, поскольку .
не соответствует символам новой строки. В большинстве разновидностей регулярных выражений вы используете однострочный режим, чтобы точка соответствовала всем символам , включая переводы строки, например: /<!--.*-->/s
или this: (?s)<!--.*-->
. Но JavaScript не поддерживает эту функцию, поэтому большинство людей вместо этого используют [\s\S]
, что означает «любой символ пробела или любой символ, который не пробел» - другими словами, любой символ.
Но это тоже неправильно, поскольку (как указал Джейсон в своем комментарии) он будет жадно сопоставлять все, начиная от первого <!--
до последнего -->
, что может включать несколько отдельных комментариев и весь материал, не содержащий комментариев. между ними. Чтобы сделать это действительно правильно, вероятно, не стоит усилий. При использовании регулярных выражений для соответствия HTML, вы все равно должны сделать много упрощающих предположений; если вы не можете принять определенный уровень правильной формы, вы можете сдаться. В этом случае должно быть достаточно, чтобы квантификатор не был жадным:
var regex5 = /<!--[\s\S]*?-->/g;