Экранирование слэшей

154
25 февраля 2019, 21:10

как стоит изменить код, чтобы он мог понимать, где идёт более 2 слэшей подряд?

private static void ParseComplexField(string line, StringBuilder tokenBuilder, ref int nextSymbol, char typeOfQuotes)
    {
        for (; nextSymbol < line.Length; nextSymbol++)
        {
            if (line[nextSymbol] == '\\')
            {
                if (line[nextSymbol - 1] == '\\')
                    tokenBuilder.Append('\\');
            }
            else if (line[nextSymbol] == typeOfQuotes)
            {
                if (line[nextSymbol - 1] == '\\' && line[nextSymbol - 2] != '\\')
                    tokenBuilder.Append(typeOfQuotes);
                else
                    break;
            }
            else
                tokenBuilder.Append(line[nextSymbol]);
        }
    }
Answer 1

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

Решается это с помощью флага, значение которого устанавливается в true при нахождении символа экранирования (слэша):

private static void ParseComplexField(string line, StringBuilder tokenBuilder, ref int nextSymbol, char typeOfQuotes)
{
    var handleCharAsIs = false;
    for (; nextSymbol < line.Length; nextSymbol++)
    {
        if (handleCharAsIs)
        {
            tokenBuilder.Append(line[nextSymbol]);
            handleCharAsIs = false;
        }
        else if (line[nextSymbol] == '\\')
        {
            handleCharAsIs = true;
        }
        else if (line[nextSymbol] == typeOfQuotes)
        {
            //не знаю зачем это - видимо, для общей задачи
            break;
        }
        else
        {
            tokenBuilder.Append(line[nextSymbol]);
        }
    }
}

Результаты:

\\\\\\\\  ->  \\\\
abc       ->  abc
\\\abc\\  ->  \abc\
READ ALSO
Как создать консольное приложение .Net Standard?

Как создать консольное приложение .Net Standard?

Внимание! Это перевод вопроса Console App (Net Standard) not listed

141
Xamarin Forms C# Как убрать скрол у ListView?

Xamarin Forms C# Как убрать скрол у ListView?

Начинаю вникать в xamarinРешил написать простенький проект а-ля заметочника

145
Раскодировать ответ

Раскодировать ответ

С помощью класса HttpClient конекчусь к некоему APIПолучаю такой ответ:

151
узнать на php c какой формы ее класс пришел ajax запрос?

узнать на php c какой формы ее класс пришел ajax запрос?

узнать на php c какой формы ее класс пришел ajax запрос? ели с классом class_1 оправить 1 собщение, если class_2 - второе

153