Получить ведущие пробелы - PullRequest
       20

Получить ведущие пробелы

2 голосов
/ 11 октября 2010

Я только что написал этот метод, и мне интересно, если что-то подобное уже существует в рамках? Похоже, что один из тех методов ...

Если нет, есть ли лучший способ сделать это?

/// <summary>
/// Return the whitespace at the start of a line.
/// </summary>
/// <param name="trimToLowerTab">Round the number of spaces down to the nearest multiple of 4.</param>
public string GetLeadingWhitespace(string line, bool trimToLowerTab = true)
{
    int whitespace = 0;
    foreach (char ch in line)
    {
        if (ch != ' ') break;
        ++whitespace;
    }

    if (trimToLowerTab)
        whitespace -= whitespace % 4;

    return "".PadLeft(whitespace);
}

Спасибо

Edit: После прочтения некоторых комментариев становится ясно, что мне также нужно обрабатывать вкладки.

Я не могу привести очень хороший пример, потому что сайт сокращает пространство до одного, но я попробую:

Скажем, входные данные представляют собой строку с 5 пробелами, метод вернет строку с 4 пробелами. Если ввод меньше 4 пробелов, он возвращает "". Это может помочь:

input spaces | output spaces
0 | 0
1 | 0
2 | 0
3 | 0
4 | 4
5 | 4
6 | 4
7 | 4
8 | 8
9 | 8
...

Ответы [ 5 ]

6 голосов
/ 11 октября 2010

Я не запускал никаких тестов производительности, но это меньше кода.

...

whitespace = line.Length - line.TrimStart(' ').Length;

...
2 голосов
/ 11 октября 2010

Я уверен, что ничего не встроено, но вы можете использовать регулярное выражение, чтобы сделать это, если вам удобно с ними.Это соответствует любому пробелу в начале строки:

public static string GetLeadingWhitespace(string line)
{
  return Regex.Match(line, @"^([\s]+)").Groups[1].Value;
}

ПРИМЕЧАНИЕ. Это не будет работать так же хорошо, как простой цикл.Я бы просто пошел с вашей реализацией.

2 голосов
/ 11 октября 2010

Вы должны использовать Char.IsWhiteSpace вместо сравнения с ' ', обычно. Не все "пробелы" ' '

0 голосов
/ 11 октября 2010

А как насчет метода расширения для String? Я перешел в tabLength, чтобы сделать функцию более гибкой. Я также добавил отдельный метод для возврата длины пробела, поскольку один комментарий - это то, что вы ищете.

public static string GetLeadingWhitespace(this string s, int tabLength = 4, bool trimToLowerTab = true)
{
  return new string(' ', s.GetLeadingWhitespaceLength());
}

public static int GetLeadingWhitespaceLength(this string s, int tabLength = 4, bool trimToLowerTab = true)
{
  if (s.Length < tabLength) return 0;

  int whiteSpaceCount = 0;

  while (Char.IsWhiteSpace(s[whiteSpaceCount])) whiteSpaceCount++;

  if (whiteSpaceCount < tabLength) return 0;

  if (trimToLowerTab)
  {
    whiteSpaceCount -= whiteSpaceCount % tabLength;
  }

  return whiteSpaceCount;
}
0 голосов
/ 11 октября 2010

Ничего не встроено, но как насчет:

var result = line.TakeWhile(x => x == ' ');
if (trimToLowerTab)
    result = result.Skip(result.Count() % 4);
return new string(result.ToArray());
...