Подтвердить что ты не робот

Получить обратную косую черту внутри строки - Javascript

Я пробовал много способов получить одиночную обратную косую черту из выполненной (я не имею в виду вход от html).

Я могу получить специальные символы в виде вкладки, новой строки и многих других, а затем избежать их до \\t или \\n или \\(someother character), но я не могу получить обратную косую черту, когда рядом с ней стоит неспециальный символ.

Мне не нужно что-то вроде:

str = "\apple";   // I want this, to return:
console.log(str); // \apple

и если я попытаюсь получить символ в 0, я получаю a вместо \.

4b9b3361

Ответ 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 выглядит как восьмеричный литерал.

Ответ 2

\ - это escape-символ, за которым следует неспециальный символ, он не становится литералом \. Вместо этого вам нужно удвоить его \\.

console.log("\apple");  //-> "apple" 
console.log("\\apple"); //-> "\apple" 

Невозможно получить исходное определение необработанной строки или создать литеральную строку без escape-символов.

Ответ 3

Попробуйте String.raw метод:

str = String.raw`\apple` // "\apple"

Ссылка здесь: String.raw()

Ответ 4

str = "\apple" выходит из первого a, поэтому вы остаетесь с a в качестве первого символа. Нет способа (afaik) сделать "\apple" сохранить это '\', не убегая от него. Вы могли бы автоматизировать экранирование, как это:

String.prototype.esc = function(){
  return '\\'+this;
}
//and use it as
var str = 'a'.esc()+'pple';
//or
var str = 'apple'.esc();
//tests
str[0];                   //=> '\'
str.match(/\\/);          //=> ['\']
RegExp('\\\\').test(str); //=> true
str.substr(0,1);          // '\'