(如果您想知道如何在编辑器中将制表符转换为空格,请查看我的回答末尾。)
最近有要求我将制表符替换为空格。
这个解决方案会用空格替换制表符,每个制表符会被替换成最多 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 ((currentPosition % tabLength) == 1)
currentPosition += tabLength;
else
{
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