Это может быть проще реализовать не-Regex решения:
var numberedLines = input.Text
.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None)
.Select ((line, index) => (index + 1) + " " + line)
.ToArray();
var result = string.Join(Environment.NewLine, numberedLines);
output.Text = result;
Первая строка использует string.Split()
разделить строку вокруг линии возвращается в массив. Затем я использую метод LINQ .Select
для применения функции к каждому элементу массива - в этом случае добавление номера строки и пробела в начале каждой строки (index + 1
необходимо, потому что значения индекса основаны на 0). Затем я использую метод string.Join
, чтобы объединить массив в одну строку.
Демо: http://ideone.com/DrFTfl
Это на самом деле может быть сделано с помощью регулярных выражений, если вы используете MatchEvaluator
делегат применить нумерацию строк:
var index = 1;
output.Text = Regex.Replace(input.Text, "^",
(Match m) => (index++).ToString() + " ",
RegexOptions.Multiline);
Узор ^
обычно соответствует началу выражение. Однако, с RegexOptions.Multiline
, он соответствует началу каждой строки. Затем для замены я использую делегат (анонимная функция), который добавляет #
+ пробел в начало строки, а затем увеличивает индексный счетчик для следующей строки.
Демо: http://ideone.com/9LD0ZY
Когда я попытался использовать решение без регекса, я получил красную строку squiggly под 'string.Join (" \ n ", numberedLines);' Regex solution работал отлично. любая идея, почему не-Regex не работает? – Kazankoph
небольшое улучшение: 'string.Join (" \ r \ n ", input.Text.Split ('\ n'). Выберите ((строка, строка) => string.Format (" {0} \ t {1} ", lineNumber + 1, line.TrimEnd ('\ r'))));' – publicgk
@ Kazankoph: Ah. См. Обновление с помощью .ToArray() '. По-видимому, моя локальная тестовая среда имеет перегрузку, которая позволяет передавать 'IEnumerable' в' string.Join', но обычно для этого требуется массив. – mellamokb