Для поиска переменной и ее экранирования:
const escapeStringRegexp = require('escape-string-regexp')
const name = 'foo'
db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})
Экранирование переменной защищает запрос от атак с помощью.. * или другого регулярного выражения.
Вы можете попробовать что-то вроде этого:
String str = "This is a \"sample\" ";
Console.WriteLine("Original string: {0}", str);
Console.WriteLine("Replaced: {0}", str.Replace('\"', '"'));
Попробуйте это:
string line="This is a \"sample\" " ;
replaced =line.Replace(@"\", "");
Случай 1: Если значение в переменной line
на самом деле This is a \"sample\"
, то вы можете сделать line.Replace("\\\"", "\"")
.
Если нет: \"
является escape-последовательностью. в коде он отображается как \"
, однако при компиляции он будет отображаться как "
вместо исходного \"
.
Причина выхода из кавычек заключается в том, что компилятор не может определить, находится ли кавычка в другой кавычке или нет. Давайте рассмотрим ваш пример:
"This is a "sample" "
это This is a
как одна группа, затем неизвестный токен sample
, затем еще одна цитата ? или
This is a "sample"
все в цитате? Мы можем сделать предположение, посмотрев на контекст, но компилятор не может. Следовательно, мы используем escape-последовательность, чтобы сказать компилятору: «Я использовал этот символ двойной кавычки в качестве символа, а не закрытие / открытие строкового литерала».
См. Также: https: // en. wikipedia.org/wiki/Escape_sequences_in_C
Желаемый результат: это образец
Заданная строка: "This is a \"sample\""
Проблема: у вас есть экранирующие символы, защищающие двойные кавычки от интерпретации. escape-символ \
- это инструкция буквально использовать кавычку вместо того, чтобы указывать разрыв строки. Это означает, что фактическое строковое значение равно "This is a "sample""
, когда используется в качестве вывода.
Ответ, удаляющий \
, может работать, но он делает для вонючего кода, потому что удаление escape-символа таким способом может сделать неясным, что вы намереваетесь, и мешает вам избежать любого символа ,
Удаление "
может сработать, хотя оно не позволяет использовать какие-либо кавычки, и некоторые IDE могут оставить escape-символ, чтобы испортить вам день.
Мы хотим одну конкретную цель, кавычки вокруг «образца».
string sample = "This is a \"sample\"";
List<string> sampleArray = sample.Split(' ').ToList(); // samplearray is now split into ["This", "is", "a", "\"sample\""]
var x = sampleArray.FirstOrDefault(t => t == "\"sample\""); //isolate our needed value
if (x != null) //prevent a null reference in case something went wrong and samplearray wasnt as expected
{
var index = sampleArray.IndexOf(x); //get the location of the value we just picked
x = x.Replace("\"", string.Empty); //replace chars
sampleArray[index] = x; //assign new value to the list
}
return String.Join(" ", sampleArray); //return the string joined together with spaces.
Поскольку кавычки используются для начала и окончания строк (они являются типом управляющего символа), вы не можете иметь кавычку в середине строки, потому что она будет заканчивать строку
string replaced = "This is a "sample" ";
/*
You can see from the syntax highlighting (red) that the string is being
detected as <This is a > and <sample> is black meaning it is detected as
code (and will cause a syntax error)
*/
Чтобы поместить кавычку в середину строки, мы избегаем ее (экранирование означает, что она трактуется как символьный литерал вместо управляющего символа) с использованием escape-символа, который в C # является обратной косой чертой.
string line = "This is a \"sample\"";
Console.WriteLine(line);
// Output: This is a "sample"
string literalLine = @"This is a ""sample""";
Console.WriteLine(literalLine);
// Output: This is a "sample"
Символ @ в C # означает, что я хочу, чтобы это была буквальная строка (игнорируйте управляющие символы), однако кавычки по-прежнему начинаются и заканчиваются строками, поэтому для печати кавычки в литеральной строке вы пишете две из них " «(так устроен язык)