【问题标题】:Remove tabulation or space of multiple lines in text删除文本中多行的制表符或空格
【发布时间】:2019-03-06 07:07:27
【问题描述】:

您可能都知道在各种文本编辑器中删除制表符或多行空格的键盘快捷键(Shift + Tab)。 我想用 C# 中的字符串来执行此操作。

我知道如何以一种非常未优化且不是非常错误的保存方式来做到这一点。但是有一些“简单”的方法可以做到这一点,例如使用正则表达式,还是剪掉一些优化的代码以便在那里使用?

但重点是从一开始就删除一个制表位。

一些代码的想法:

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

【问题讨论】:

  • line.Trim() 删除所有前导和尾随空格,包括制表符。
  • 你能显示你想要的确切输出吗,这是否仅限于 4 个?
  • 注意Remove方法返回的是新的字符串,不会影响原字符串。
  • @OlivierJacot-Descombes 关键是从一开始只删除一个制表位(就像使用 Shift + Tab 一样)
  • Text in strange tab 后面有一个空格的原因是什么?您还假设制表符是 4 个空格吗?最后,你想用空格替换所有标签,还是不在乎

标签: c# text text-editor tabstop


【解决方案1】:

这是一种我认为您的原始代码打算执行的方法,即从行首删除最多 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));

【讨论】:

  • 是的,但是您应该在 continue 之前添加 i-- 以防止字符跳过。并且 i++ 如果一个字符是空格但不应该被影响,在此之后继续删除 4 个空格。
  • 哦,我明白你的意思了。我们希望保留其他空白字符,但仍删除 4 个空格,即使其中一些在该空白字符之后(对吗?)。我更新了代码示例。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多