Ответ 1
(См. обновление ES2015 в конце ответа.)
Вы отметили свой вопрос как string
, так и regex
.
В JavaScript обратная косая черта имеет особое значение как в строковых литералах, так и в регулярных выражениях. Если вам нужна фактическая обратная косая черта в строке или регулярном выражении, вы должны написать два: \\
.
Эта строка начинается с одной обратной косой черты, первая из которой вы видите в литере, является символом escape, который говорит нам, чтобы мы использовали следующий символ буквально:
var str = "\\I have one backslash";
Это регулярное выражение будет соответствовать одиночному обратному косую черту (не два); опять же, первый, который вы видите в литерале, - это escape-символ, говорящий нам буквально взять следующий символ:
var rex = /\\/;
Если вы используете строку для создания регулярного выражения (вместо использования литерала регулярных выражений, как я уже говорил выше), обратите внимание, что вы имеете дело с двумя уровнями: уровнем строки и уровнем регулярных выражений. Таким образом, чтобы создать регулярное выражение, используя строку, которая соответствует одному обратному косую черту, вы в конечном итоге используете четыре:
// Matches *one* backslash
var rex = new RegExp("\\\\");
Это потому, что во-первых, вы пишете строковый литерал, но хотите на самом деле наложить туда обратную косую черту. Таким образом, вы делаете это с помощью \\
для каждой вашей обратной косой черты. Но вашему регулярному выражению также требуется два \\
для каждой конкретной обратной косой черты, которую вы хотите, и поэтому ей нужно увидеть две обратные косые черты в строке. Следовательно, всего четыре. Это одна из причин, по которой я избегаю использования new RegExp(string)
, когда могу; Я смущен легко.: -)
Обновление ES2015
Ускоренная перемотка вперед до 2015 года и как указывает Dolphin_Wood, новый стандарт ES2015 дает нам шаблонные литералы, функции тегов и String.raw
:
// Yes, this unlikely-looking syntax is actually valid ES2015
let str = String.raw`\apple`;
str
заканчивается тем, что в нем присутствуют символы \
, a
, p
, p
, l
и e
. Просто будьте осторожны: в вашей "строке" (шаблоне) нет ${
, так как это литерал шаблона, а ${
запускает подстановку. Например:.
let foo = "bar";
let str = String.raw`\apple${foo}`;
... заканчивается \applebar
. Также обратите внимание, что это не совсем похоже на строки "verbatim" в С# или аналогичные, так как последовательности, соответствующие LegacyOctalEscapeSequence в спецификации, недопустимы и вызывают синтаксическую ошибку. Так, например,
// Fails
let str = String.raw`c:\foo\12\bar`;
... не получается, потому что \12
выглядит как восьмеричный литерал.