#c# #regex
#c# #регулярное выражение
Вопрос:
Я ищу в Интернете, и у меня есть только частичное решение, поэтому я задаю этот вопрос.
Ввод:
[A] this is A, and , [B] this is B, and hello , [C] this is C - From Here
Я хочу иметь список:
list[0] == "this is A, and"
list[1] == "this is B, and hello"
list[2] == "this is C"
list[3] == "From Here"
Я считаю, что у меня должно быть что-то вроде этого:
Regex pattern = new Regex(@"^[A] (.*) , [B] (.*) , [C] (.*) - (.*)$");
List<string> matches = pattern.Matches(input).OfType<Mathc>().Select(m => m.value).Distinct().ToList();
Но это не работает. Я хотел бы спросить, как заставить это работать. Спасибо.
Комментарии:
1. Кажется, регулярное выражение «работает» — regex101.com/r/VuQaNJ/1 . Вам нужна помощь только с кодом? Или число
[A]
,[B]
, и т.д. является переменной?2. Вам нужно выполнить итерацию
Groups
результатаMatchCollection
, который имеет только одно совпадение. Обратите внимание, что первой группой будет полное совпадение, затем каждая из ваших групп захвата.
Ответ №1:
Регулярное выражение правильное, единственное, что вам нужно сделать, это выполнить итерацию по группам совпадений. В вашем случае первой группой будет целое предложение, поэтому вы можете просто пропустить первый элемент.
PS и, конечно, не забудьте проверить, представлен ли хотя бы один результат совпадения. Также, если эта функция будет выполняться много раз, я рекомендую вам извлекать regex в статический член вашего класса (из-за использования производительности и памяти).
private static readonly Regex pattern = new Regex(@"^[A] (.*) , [B] (.*) , [C] (.*) - (.*)$");
Окончательная версия метода (с шаблоном в качестве статического члена) выглядит следующим образом.
public static List<string> GetMatches(string input)
{
var matchResult = pattern.Match(input);
if (matchResult.Length > 0)
{
return matchResult.Groups.Values
.Skip(1)
.Select(x => x.Value)
.ToList();
}
return new List<string>();
}
Ответ №2:
Проблема заключается в путанице между совпадением и группой. Регулярное выражение совпадает только один раз, но внутри него есть несколько групп. Найдите первое совпадение с [0]
помощью, затем используйте .OfType<Group>()
:
List<string> matches = pattern.Matches(input)[0].Groups.OfType<Group>().Select(m => m.Value).Distinct().ToList()
Это даст вам 5 результатов:
Вы можете избавиться от первой с .Skip(1)
помощью или matches.RemoveAt(0);
.