(Если вы ищете способ преобразования табуляции в пробелы в редакторе, см. В конце моего ответа)
Почти 8-летний вопрос, но недавно мне потребовалось заменить символы табуляции пробелами.
Решение заменяет табуляцию на до 4 или 8 пробелов.
Логика перебирает входную строку по одному символу за раз и отслеживает текущую позицию (столбец #) в выходной строке.
- Если встречается
\t
(символ табуляции) - Находит следующую позицию табуляции, вычисляет, сколько пробелов нужно получить до следующей остановки табуляции, заменяет \ t на это количество пробелов.
- Если
\n
(новая строка) - добавляет его к выходной строке и сбрасывает указатель положения на 1 в новой строке. Новые строки в Windows - \r\n
, а в UNIX (или разновидностях) - \n
, поэтому я полагаю, что это должно работать на обеих платформах. Я тестировал на Windows, но UNIX не пригодился.
- Любые другие символы - добавляет его к выходной строке и увеличивает позицию.
.
using System.Text;
namespace CSharpScratchPad
{
class TabToSpaceConvertor
{
static int GetNearestTabStop(int currentPosition, int tabLength)
{
// if already at the tab stop, jump to the next tab stop.
if ((currentPosition % tabLength) == 1)
currentPosition += tabLength;
else
{
// if in the middle of two tab stops, move forward to the nearest.
for (int i = 0; i < tabLength; i++, currentPosition++)
if ((currentPosition % tabLength) == 1)
break;
}
return currentPosition;
}
public static string Process(string input, int tabLength)
{
if (string.IsNullOrEmpty(input))
return input;
StringBuilder output = new StringBuilder();
int positionInOutput = 1;
foreach (var c in input)
{
switch (c)
{
case '\t':
int spacesToAdd = GetNearestTabStop(positionInOutput, tabLength) - positionInOutput;
output.Append(new string(' ', spacesToAdd));
positionInOutput += spacesToAdd;
break;
case '\n':
output.Append(c);
positionInOutput = 1;
break;
default:
output.Append(c);
positionInOutput++;
break;
}
}
return output.ToString();
}
}
}
Код вызова будет выглядеть как
string input = "I\tlove\tYosemite\tNational\tPark\t\t,\t\t\tGrand Canyon,\n\t\tand\tZion";
string output = CSharpScratchPad.TabToSpaceConvertor.Process(input, 4);
Выходная строка получит значение
I love Yosemite National Park , Grand Canyon,
and Zion
Как преобразовать табуляции в пробелы в редакторе?
Если вы наткнулись на этот вопрос, потому что вы не смогли найти возможность конвертировать вкладки в пробелы в редакторах (так же, как я и думал написать свою собственную утилиту для этого), вот где эта опция находится в разных редакторах. -
Notepad++: Edit > Blank Operations > TAB to Space
Visual Studio: Edit > Advanced > Untabify Selected Lines
SQL Management Studio: Edit > Advanced > Untabify Selected Lines