Найти последовательные строки в строке, начинающейся с "pipe" - PullRequest
0 голосов
/ 14 марта 2019

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

У меня есть такая строка:

|Text1|Text2|Text3\n|Text4|Text5|Text6\nSomething else\n|Text6|Text8|Text9\n

Есть несколько «строк» ​​текста (где строки означают символы новой строки), некоторые из них начинаются с | (и, возможно, включая другие каналы).

Мне нужно регулярное выражение для C # RegEx, которое предоставляет следующие группы:

Group1:

|Text1|Text2|Text3\n|Text4|Text5|Text6\n

Group2:

|Text6|Text8|Text9\n

Другими словами: для каждой строки, начинающейся с |, мне нужна вся строка. Если есть несколько последовательных строк, начинающихся с |, мне нужны эти строки вместе в одной группе.

Как и просили здесь несколько дополнительных примеров:

Пример 1

Следующий ввод

Text1|Text2\n

не должен возвращать совпадения, так как нет строки, начинающейся с |

Пример 2

Следующий ввод

|Text1|Text2

не должен возвращать совпадения, поскольку нет строки, заканчивающейся на \n

Пример 3

Следующий ввод

sometext\n|Text1|Text2\nsometext

должен вернуть 1 группу

|Text1|Text2\n

потому что строка начинается с | и заканчивается \n

Пример 4

Следующий ввод

sometext\n|someothertext\nsometext\n|someothertext\n

должно вернуть 2 группы

|someothertext\n

и

|someothertext\n

потому что эти две строки начинаются с | и заканчиваются \n

Пример 5

Следующий ввод

sometext\n|someothertext\n|sometext\n|someothertext\n

должен вернуть 1 группу

|someothertext\n|sometext\n|someothertext\n

потому что все три строки начинаются с | и заканчиваются \n, и они являются последовательными.

Я обнаружил, что следующий RegEx соответствует одной строке, начинающейся с | и заканчивающейся \n:

(?s)(\\n\|)((.*?)\\n)

но он не распознает последовательные строки. Я знаю, что мне как-то нужно использовать обратную ссылку \1, но я пока не получил ее.

Чтобы уточнить : моя реальная задача - улучшить следующая разметка для библиотеки WPF https://github.com/theunrepentantgeek/Markdown.XAML, чтобы она поддерживала синтаксис таблицы.

Поскольку разметка для WPF-библиотеки основана на наборе выражений RegEx, используемых в IEnumerable-pipe, я хотел остаться в этом шаблоне и просто добавить часть, необходимую для таблиц.

Таблица в уценке описывается несколькими строками, начинающимися с трубы, где каждый столбец таблицы разделен трубой. Последовательные строки, начинающиеся с трубы, принадлежат одной таблице. Содержимое каждого «столбца» (которое представляет собой значение между двумя каналами в строке) может быть любым текстом или даже другим выражением-разметкой.

Синтаксис таблицы для уценки описан здесь https://www.tablesgenerator.com/markdown_tables.

1 Ответ

0 голосов
/ 15 марта 2019

Похоже, вам вообще не нужен RegEx.Просто разделите ваш ввод по "\ n", а затем сгруппируйте строки умным способом.Попробуйте этот код:

var input = "|Text1|Text2|Text3\n|Text4|Text5|Text6\nSomething else\n|Text6|Text8|Text9\n";

var lines = input.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
    .GroupAdjacent(line => line.StartsWith("|"))
    .Where(x => x.Key) // select only lines that starts with pipe
    .Select(g => string.Join("\n", g))
    .ToArray();

Используется метод GroupAdjacent из библиотеки MoreLinq

Для вашего ввода будет вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...