Как подобрать регулярное выражения для поиска абзацев между конкретными словами
Необходимо подобрать регулярку для разделения текста на 4 абзаца(начиная от Issue заканчивая Affected Nodes). Affected Nodes бывает 2-ух видов, иногда одного:
Issue 1: test
Summary: test
Solution: test
Affected Nodes: Internal 11.100.3.333
Affected Nodes: External 33.33.333.333 (test)
Issue 2: test
Summary: test
Solution: test
Affected Nodes: Internal 11.100.3.333
Issue 3: test
Summary: test
Solution: test
Affected Nodes: External 33.33.333.333 (test)
Issue 4: test
Summary: test
Solution: test
Affected Nodes: Internal 11.100.3.333
Affected Nodes: External 33.33.333.333 (test)
Issue 5: test
Summary: test
Solution: test
Affected Nodes: Internal 11.100.3.333
Необходимо это для того, чтобы распарсить данные в модельку вида:
public class Issue
{
public string IssueName { get; set; }
public string Summary { get; set; }
public string Solution { get; set; }
public string InternalNodes { get; set; }
public string ExternalNodes { get; set; }
}
Ответы (2 шт):
Автор решения: Aleksey Vaganov
→ Ссылка
Если каждый абзац завершается двумя переводами строк, то подойдет такая регулярка:
(Issue[a-zA-Z0-9:.()\s]+?(?=\n{2}))
Автор решения: Qwertiy
→ Ссылка
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Issue
{
public int Id { get; set; }
public string IssueName { get; set; }
public string Summary { get; set; }
public string Solution { get; set; }
public string InternalNodes { get; set; }
public string ExternalNodes { get; set; }
}
public class Test
{
public static string GetText()
{
using (var sr = new StreamReader(Console.OpenStandardInput(), Console.InputEncoding))
return sr.ReadToEnd();
}
public static void Main()
{
var issues = Regex.Matches(GetText(), @"Issue\s*(\d+):\s*([^\r\n]*?)\s*\r?\n(?:Summary:\s*([^\r\n]*?)\s*\r?\n|Solution:\s*([^\r\n]*?)\s*\r?\n|Affected Nodes: Internal\s*([^\r\n]*?)\s*\r?\n|Affected Nodes: External\s*([^\r\n]*?)\s*\r?\n)*")
.Cast<Match>()
.Select(m => new Issue
{
Id = int.Parse(m.Groups[1].Value),
IssueName = m.Groups[2].Value,
Summary = m.Groups[3].Value,
Solution = m.Groups[4].Value,
InternalNodes = m.Groups[5].Value,
ExternalNodes = m.Groups[6].Value,
})
.ToList();
foreach (var x in issues)
Console.WriteLine("{0} {1} {2,-6} {3,-6} {4,-12} {5,-12}", x.Id, x.IssueName, x.Summary, x.Solution, x.InternalNodes, x.ExternalNodes);
}
}
1 test test первая 11.100.3.333 33.33.333.333 (test)
2 test test test 11.100.3.333
3 test вторая test 33.33.333.333 (test)
4 test test test 22.211.4.444 33.33.333.333 (test)
5 test test test