У меня есть строки, ["02-03-2013#3rd Party Fuel", "-1#Archived", "2#06-23-2013#Newswire"]
, которые я хочу разбить на несколько частей. Эти строки имеют префикс с ключами даты и индекса и содержат имя.Рекурсивный RegEx для соответствия ключам и имени
Я разработал RegEx
, который соответствует каждой клавише правильно. Однако, если я хочу совместить индексный ключ, ключ даты и имя с махом. Найден только первый ключ. Кажется, рекурсивная группа не работает, как я ожидаю.
private const string INDEX_KEY_REGEX = @"(?<index>-?\d+)";
private const string DATE_KEY_REGEX = @"(?<date>(?:0?[1-9]|1[012])-(?:0?[1-9]|[12]\d|3[01])-\d{4})";
private const string KEY_SEARCH_REGEX = @"(?<R>(?:^|(?<=#))({0})#(?(R)))(?<name>.*)";
private string Name = "2#06-23-2013#Newswire"
... = Regex.Replace(
Name,
String.Format(KEY_SEARCH_REGEX, INDEX_KEY_REGEX + "|" + DATE_KEY_REGEX),
"${index}, ${date}, ${name}"
);
// These are the current results for all strings when set into the Name variable.
// Correct Result: ", 02-03-2013, 3rd Party Fuel"
// Correct Result: "-1, , Archived"
// Invalid Result: "2, , 06-23-2013#Newswire"
// Should be: "2, 06-23-2013, Newswire"
Острый глаз видит то, что я пропустил?
Окончательное решение, как это было нужно
Оказывается, мне не нужно рекурсивный группу. Я просто нуждался в 0 для многих последовательностей. Вот полный RegEx
.
(?:(?:^|(?<=#))(?:(?<index>-?\d+)|(?<date>(?:0?[1-9]|1[012])-(?:0?[1-9]|[12]\d|3[01])-(\d{2}|\d{4})))#)*(?<name>.*)
И сегментированная RegEx
private const string INDEX_REGEX = @"(?<index>-?\d+)";
private const string DATE_REGEX = @"(?<date>(?:0?[1-9]|1[012])-(?:0?[1-9]|[12]\d|3[01])-(\d{2}|\d{4}))";
private const string KEY_WRAPPER_REGEX = @"(?:^|(?<=#))(?:{0})#";
private const string KEY_SEARCH_REGEX = @"(?:{0})*(?<name>.*)";
Он работает для этого тестового примера, если вы удалите тест '^ |'. Какова цель этого? – Bobson
Это должно было гарантировать, что ключи всегда находятся в начале и никогда в конце или не имеют подвешенную строку перед ними. Я буду тестировать без него, но я думаю, что это нарушит указанное требование. Я посмотрю, что я найду. – roydukkey
Итак, при моем тестировании были получены следующие результаты: '2 #, 06-23-2013, Newswire' и' -1 # Archived' (нет совпадений). Так что дальше от желаемого. – roydukkey