Как объединить или вставить символ «@» в строку, включая escape-символы, не определяя переменную строки с нуля в C # - PullRequest
4 голосов
/ 16 октября 2010

привет, у меня есть 2 связанных вопроса.

1) предположим, что у нас есть:

string strMessage = "\ nHellow \ n \ nWorld";console.writeln (strMessage);Результат:

ХеллоуМир

Теперь, если мы хотим показать строку в оригинальном формате в одну строку , мы должны переопределить первую переменную с нуля.

string strOrignelMessage = @ "\ nHellow \ n \ nWorld";

console.writln (strOrignelMessage);

Результат: \ nHellow \ n \ nWorld ---------------------> и все в порядке.

Мне интересно, есть ли способ избежать определения новой переменной (strOrignelMessage) в коде для этой цели и просто использовать только первую строковую переменную (strMessage) и применять некоторые приемы и печатать ее в одну строку.

сначала я попробовал следующий обходной путь, но он делает некоторые ошибки. Предположим, у нас есть:string strMessage = "a \ aa \ nbb \ nc \ rccc";

string strOrigenalMessage = strMessage.replace ("\ n", "\\ n"). Replace ("\ r", "\\ r");

Console.writeln (strOrigenalMessage)

результат: aa \ nbb \ nc \ rccc

обратите внимание, что перед первым "\" не напечатано . и теперь мой второй вопрос:

2) Как мы можем исправить новую проблему с одним "\" в строке

Я надеюсь правильно озаглавить эту проблему, и моих объяснений будет достаточно, спасибо

Ответы [ 4 ]

4 голосов
/ 16 октября 2010

Нет, потому что компилятор уже преобразовал все экранированные символы в исходной строке в символы, которые они представляют. После этого уже слишком поздно конвертировать их в не специальные символы. Вы можете выполнить поиск и замену, преобразовав '\ n' в буквально @ "\ n", но это странно, и вам лучше сначала правильно определить строку. Если вы в первую очередь хотели избежать обратной косой черты, почему бы не поставить дополнительный символ обратной косой черты перед каждым из них:

Вместо "\ n" используйте "\\ n".

Обновлено в ответ на ваш комментарий:

Если строка поступает из пользовательского ввода, вам не нужно экранировать обратную косую черту, потому что она будет сохранена как обратная косая черта во входной строке. Экранирующий символ работает только как экранирующий символ в строковых литералах в коде (и перед ним не стоит @, что делает их дословными строковыми литералами).

1 голос
/ 16 октября 2010

, если вы хотите, чтобы "\ n \ n \ a \ a \ r \ blah" печатался как \n\n\a\a\r\blah без @, просто замените все \ на \\

\ - это экскаватор в невербальной строке. Так что вам просто нужно сбежать из побега, как бы.

0 голосов
/ 25 октября 2010

объяснений для Энтони Пеграма (если я вас правильно понимаю) и всех, кто нашел это полезным

Я думаю, что я нашел свой путь в вопросе 2.

Сначала, к сожалению, я подумал, чтоэкранирующие символы ограничивают \ n, \ t, \ r, \ v, и это заставило меня задуматься, потому что в моем примере строки я использовал \ a и \ b, и поведение компилятора было для меня непонятным.

, но в конце концовя обнаружил, что \ a и \ b тоже находятся в наборе escape-символов. и если вы используете "\" без escape-символов, возникнет ошибка времени компиляции (это так забавно, когда я снова думаю о своей ошибке)

Пожалуйста, обратитесь к этой полезной статье MSDN для получения дополнительной информации.

2.4.4.5 Строковые литералы

, и вы не можете заменить \ (single \) на \\, поскольку принципиально вы не можете иметь (single \) без использования escape-символовпосле него в строке. Поэтому мы можем написать такую ​​строку в коде:

string strTest = "abc \ pwww";------> ошибка времени компиляции

и для получения версии строки неактивных escape-символов мы можем просто использовать метод string.replace, как я использовал до.

простите за долгую историю, спасибо всем за сотрудничество.

0 голосов
/ 17 октября 2010

Если вы хотите использовать обе строки, но хотите, чтобы в коде была только одна строка, напишите строку с @ и создайте другую с помощью Replace (@ "\ n", "\ n").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...