#c# #text #text-editor #tabstop
#c# #текст #текстовый редактор #остановка табуляции
Вопрос:
Вы все, наверное, знаете сочетание клавиш (Shift Tab) для удаления табуляции или пробела в нескольких строках в различных текстовых редакторах. Я хочу сделать это с моей строкой в C #.
Я знаю, как это сделать очень неоптимизированным способом и не очень экономящим ошибки. Но есть ли какой-нибудь «простой» способ сделать это, например, с помощью регулярного выражения или какого-нибудь оптимизированного кода, сокращенного для использования там?
Но смысл в том, чтобы просто удалить одну табуляцию с самого начала.
Некоторые взломали идею кода:
string textToEdit = "Some normal textrn"
"tText in tabrn"
" Text in space tabrn"
" t Text in strange tabrn"
"tttMultiple tabsrn"
" 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 amp;amp; 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.
line.Trim()
удаляет все начальные и конечные пробелы, включая табуляцию.2. Можете ли вы показать точный результат, который вы хотите, также это ограничено только 4?
3. Обратите внимание, что
Remove
метод возвращает новую строку, это не влияет на исходную строку.4. @OlivierJacot-Decombes Смысл в том, чтобы убрать только одну табуляцию с самого начала (например, с помощью Shift Tab)
5. В чем причина того, что
Text in strange tab
после этого перед ним стоит один пробел? также вы предполагаете, что табуляция состоит из 4 пробелов? наконец, вы хотите заменить все табуляции пробелом или вам все равно
Ответ №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 textrntText in tabrn Text in space tabrn"
" tText in strange tabrntttMultiple tabsrn Not quite a tab";
var result = string.Join(Environment.NewLine, textToEdit
.Split(new[] {Environment.NewLine}, StringSplitOptions.None)
.Select(RemoveLeadingTab));
Комментарии:
1. Да, но вы должны добавить i— перед продолжить, чтобы предотвратить пропуск символов. И i если символ является пробелом, но его не следует использовать, продолжать удалять 4 пробела после этого.
2. О, я понимаю, что вы имеете в виду. Мы хотим сохранить другие символы пробела, но все равно удалим 4 пробела, даже если некоторые из них стоят после этого символа пробела (правильно?). Я обновил пример кода.