Удалить табуляцию или пробел из нескольких строк в тексте - PullRequest
2 голосов
/ 05 марта 2019

Вы все, наверное, знаете сочетание клавиш (Shift + Tab) для удаления табуляции или пробела из нескольких строк в различных текстовых редакторах. Я хочу сделать это с моей строкой в ​​C #.

Я знаю, как сделать это очень неоптимизированным и не очень ошибочным способом. Но есть ли какой-нибудь "легкий" способ сделать это, например с Regex, или каким-то оптимизированным кодом, используемым для использования там?

Но дело в том, чтобы просто удалить одну вкладку с начала.

Некоторые взломали идею кода:

string textToEdit = "Some normal text\r\n" +
                    "\tText in tab\r\n" + 
                    "    Text in space tab\r\n" + 
                    "  \t Text in strange tab\r\n" +
                    "\t\t\tMultiple tabs\r\n" +
                    "  Not quite a tab";
int spacesInTabstop = 4;

string[] lines = textToEdit.Split('\n');

foreach (string line in lines)
{
    int charPos = 0;
    for (int i = 0; line.Length > 0 && i < spacesInTabstop + charPos; i++)
    {
        if (line[charPos] == '\t')
        {
            line = line.Remove(0, 1);
            break; //Removed tab successfully
        }
        else if (line[charPos] == ' ')
        {
            line = line.Remove(0, 1); //Remove one of four spaces
        }
        else if (char.IsWhiteSpace(line[charPos]))
        {
            charPos++; //Character to ignore
        }
        else
            break; //Nothing to remove anymore
    }
}

textToEdit = string.Join("\n", lines);

Выходные данные должны быть:

Some normal text
Text in tab 
Text in space tab
 Text in strange tab
        Multiple tabs
Not quite a tab

1 Ответ

2 голосов
/ 06 марта 2019

Вот метод, который делает то, что, как я думаю, ваш исходный код намеревается сделать, - это удалить до 4 пробелов в начале строки или символ табуляции, игнорируя при этом другие пробельные символы:

private static string RemoveLeadingTab(string input)
{
    var result = "";
    var count = Math.Min(4, input?.Length ?? 0);
    int index = 0;

    for (; index < count; index++)
    {
        if (!char.IsWhiteSpace(input[index])) break;
        if (input[index] == ' ') continue;

        if (input[index] == '\t')
        {
            index++;
            break;
        }

        if (char.IsWhiteSpace(input[index]))
        {
            result += input[index]; // Preserve other whitespace characters(?)
            if (input.Length > count + 1) count++;
        }
    }

    return result + input?.Substring(index);
}

На практике это можно назвать так:

string textToEdit = "Some normal text\r\n\tText in tab\r\n    Text in space tab\r\n" +
                    "  \tText in strange tab\r\n\t\t\tMultiple tabs\r\n  Not quite a tab";

var result = string.Join(Environment.NewLine, textToEdit
    .Split(new[] {Environment.NewLine}, StringSplitOptions.None)
    .Select(RemoveLeadingTab));
...