Замените "\\" на "\" в строке в C#
Я до сих пор не понимаю, как это сделать. Я видел много сообщений об этом, но ни одно из решений не помогло мне.
У меня есть строка с именем "a \\ b". Результат, который мне нужен, это "a \ b". Как это сделать?
У меня есть текстовый файл, в котором есть строка подключения к базе данных, указывающая на экземпляр с именем - Server \ DbInstance
Моя цель - заменить строку в текстовом файле - заменить "Server \ DbInstance" другим значением, скажем, "10.11.12.13, 1200".
Так что я:
stringToBeReplaced = @"Server\DbInstance";
newString = @"10.11.12.13, 1200";
Это где проблема начинается. Мой stringToBeReplaced всегда будет "Server\\DbInstance", и когда я ищу эту строку в моем текстовом файле, поиск завершается неудачей, поскольку в текстовом файле нет строки "Server\\DbInstance"; вместо этого он имеет только "Server\DbInstance". Так как же изменить "Server \\ DbInstance" на "Server\DbInstance"?
9 ответов
Я подозреваю, что ваша строка уже фактически содержит только одну обратную косую черту, но вы смотрите на нее в отладчике, который экранирует ее для вас в форму, которая была бы допустима как обычный строковый литерал в C#.
Если вы распечатываете его в консоли или в окне сообщения, оно отображается с двумя обратными слешами или с одним?
Если вы действительно хотите заменить двойную обратную косую черту одной, это легко сделать:
text = text.Replace(@"\\", @"\");
... но я предполагаю, что оригинал в любом случае не содержит двойной обратной косой черты. Если это не поможет, пожалуйста, дайте больше деталей.
РЕДАКТИРОВАТЬ: В ответ на отредактированный вопрос, ваш stringToBeReplaced
только один обратный слеш. Действительно. Где бы вы ни увидели два обратных слеша, этот зритель избегает его. Сама строка не имеет двух обратных косых черт. исследовать stringToBeReplaced.Length
и посчитать персонажей.
В случае, если кто-то застрял с этим и ни один из приведенных выше ответов не сработал, ниже приведено то, что сработало для меня. Надеюсь, поможет.
var oldString = "\\r|\\n";
// None of these worked for me
// var newString = oldString(@"\\", @"\");
// var newString = oldString.Replace("\\\\", "\\");
// var newString = oldString.Replace("\\u5b89", "\u5b89");
// var newString = Regex.Replace(oldString , @"\\", @"\");
// This is what worked
var newString = Regex.Unescape(oldString);
// newString is now "\r|\n"
Я пробовал процедуры ваших сообщений, но безуспешно.
Вот что я получаю от отладчика:
Исходная строка, которую я сохраняю в базе данных sqlite, была b\r\na
.. когда я читаю их, я получаю b\\r\\na
(длина в отладчике 6: "b" "\" "\r" "\" "\n" "a"
) затем я пытаюсь заменить эту строку, и я снова получаю строку с длиной 6 (вы можете видеть на картинке выше).
Я запускаю этот короткий скрипт в моей тестовой форме только с одним текстовым полем:
private void Form_Load(object sender, EventArgs e)
{
string x = "b\\r\\na";
string y = x.Replace(@"\\", @"\");
this.textBox.Text = y + "\r\n\r\nLength: " + y.Length.ToString();
}
и я получаю это в текстовом поле (поэтому, нет новых символов строки между "b" и "a":
b\r\na
Length: 6
Что я могу сделать с этой строкой, чтобы убрать обратную косую черту? (Я ожидаю новую линию между "b" и "a".)
Решение:
ОК, это невозможно сделать со стандартной заменой из-за \r
а также \n
это один персонаж. Возможно заменить часть строкового символа на символ, но невозможно заменить "половину части" одного символа. Итак, я должен заменить любой специальный символ отдельно, как это:
private void Form_Load(object sender, EventArgs e) {
...
string z = x.Replace(@"\r\n", Environment.NewLine);
...
Это дает правильный результат для меня:
b
a
У меня была та же проблема, пока я не прочитал ответ Джона Скита о том, что отладчик отображает один обратный слеш с двойным обратным слешем, даже если строка может иметь один обратный слеш. Я не знал об этом. Поэтому я изменил свой код с
text2 = text1.Replace(@"\\", @"/");
в
text2 = text1.Replace(@"\", @"/");
и это решило проблему. Примечание: я взаимодействую с R.Net, который использует одиночные косые черты в строках пути.
Regex.Unescape(string) преобразует любые экранированные символы во входной строке.
Метод Unescape выполняет одно из следующих двух преобразований:
Он обращает преобразование, выполняемое методом Escape, путем удаления escape-символа ("\") из каждого символа, экранированного методом. К ним относятся символы \, *, +,?, |, {, [, (,), ^, $, ., # И пробелы. Кроме того, метод Unescape отменяет экранирование символов закрывающей скобки (]) и закрывающей скобки (}).
Он заменяет шестнадцатеричные значения в дословных строковых литералах фактическими печатными символами. Например, он заменяет @"\x07" на "\ a" или @"\x0A" на "\ n". Он преобразуется в поддерживаемые escape-символы, такие как \a, \b, \e, \n, \r, \f, \t, \v, и буквенно-цифровые символы.
string str = @"a\\b\\c";
var output = System.Text.RegularExpressions.Regex.Unescape(str);
Ссылка:
Принятое решение работает, но я выбрал реализацию ниже. Я ТАКЖЕ понял, что указал неправильный путь. Обязательно проверьте путь, который вы используете.
@"C:\Users\me\path"
string a = @"a\\b";
a = a.Replace(@"\\",@"\");
должно сработать. Помните, что в часах Visual STudio показывалось "\", поэтому вместо "\" вы видите "\".
Вы можете просто сделать замену в вашей строке, как
Str.Replace(@"\\",@"\");