Я не очень знаком с C #, поэтому мой код не элегантный / самый эффективный. Я пришел сюда, чтобы найти ответ, который подходит для моего варианта использования, но я не смог его найти (или не смог его найти).
Для моего случая использования мне нужно было нормализовать все пробелы (WS: {space
, tab
, cr lf
}) со следующими условиями:
- WS может прийти в любой комбинации
- Заменить последовательность WS на наиболее значимый WS
tab
необходимо сохранить в некоторых случаях (файл, разделенный табуляцией, например, и в этом случае также необходимо сохранить повторные вкладки). Но в большинстве случаев они должны быть преобразованы в пробелы.
Итак, вот пример ввода и ожидаемый вывод (Отказ от ответственности: мой код тестируется только для этого примера)
Every night in my dreams I see you, I feel you
That's how I know you go on
Far across the distance and places between us
You have come to show you go on
для преобразования в
Every night in my dreams I see you, I feel you
That's how I know you go on
Far across the distance and places between us
You have come to show you go on
Вот мой код
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main(string text)
{
bool preserveTabs = false;
//[Step 1]: Clean up white spaces around the text
text = text.Trim();
//Console.Write("\nTrim\n======\n" + text);
//[Step 2]: Reduce repeated spaces to single space.
text = Regex.Replace(text, @" +", " ");
// Console.Write("\nNo repeated spaces\n======\n" + text);
//[Step 3]: Hande Tab spaces. Tabs needs to treated with care because
//in some files tabs have special meaning (for eg Tab seperated files)
if(preserveTabs)
{
text = Regex.Replace(text, @" *\t *", "\t");
}
else
{
text = Regex.Replace(text, @"[ \t]+", " ");
}
//Console.Write("\nTabs preserved\n======\n" + text);
//[Step 4]: Reduce repeated new lines (and other white spaces around them)
//into a single new line.
text = Regex.Replace(text, @"([\t ]*(\n)+[\t ]*)+", "\n");
Console.Write("\nClean New Lines\n======\n" + text);
}
}
Смотрите этот код в действии здесь: https://dotnetfiddle.net/eupjIU