У меня проблема. Я использую следующее регулярное выражение:
Pattern =
(?'name'\w+(?:\w|\s)*), \s*
(?'category'\w+(?:\w|\s)*), \s*
(?:
\{ \s*
[yY]: (?'year'\d+), \s*
[vV]: (?'volume'(?:([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))+), \s*
\} \s*
,? \s*
)*
с опцией IgnorePatternWhitespaces
.
В моем приложении все выглядело нормально, пока я не отладил его и не столкнулся с проблемой.
var Year = default(UInt32);
// ...
if((Match = Regex.Match(Line, Pattern, Options)).Success)
{
// Getting Product header information
Name = Match.Groups["name"].Value;
// Gathering Product statistics
for(var ix = default(Int32); ix < Match.Groups["year"].Captures.Count; ix++)
{
// never get here
Year = UInt32.Parse(Match.Groups["year"].Captures[ix].Value, NumberType, Culture);
}
}
Так в коде выше .. В моем случае совпадение всегда успешно. Я получаю правильное значение для Name
, но когда очередь доходит до for
цикл программы цикла просто пропускает его. Я отладил, нет Captures
в Match.Groups["year"]
. Так что это логичное поведение. Но не очевидно для меня, где я ошибаюсь. Помогите !!
Существует предыдущий связанный пост Извлечение числовых значений, заключенных в фигурные скобки Я сделал.
Спасибо!
EDIT. Входные образцы
Sherwood, reciever, {y:2008,V:5528.35}, {y:2009,V:8653.89}, {y:2010, V:4290.51}
- Мне нужно захватить значения
2008
, 5528.35
, 2009
, 8653.89
, 2010
, 4290.51
и работать с ними как с именованными группами.
2D РЕДАКТИРОВАНИЕ
Я пытался использовать ExplicitCapture
Option и следующее выражение:
(?<name>\w+(w\| )*), (?<category>\w+(w\| )*), (\{[yY]:(?<year>\d+), *[vV]:(?<volume>(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))+)\}(, )?)+
Но это не помогло.