我遇到了问题。我使用以下正则表达式:
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);
}
}
所以在上面的代码中..在我的情况下,Match总是成功的。我得到了Name
的正确值,但当转到for
时,循环程序流只是将它传递给它。我调试Captures
中没有Match.Groups["year"]
。所以这是逻辑行为。但对我来说并不明显,我错了。帮助!
我之前发过一篇帖子Extract number values enclosed inside curly brackets。
谢谢!
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
值,并将其作为命名组进行操作我尝试使用ExplicitCapture
选项和以下表达式:
(?<name>\w+(w\| )*), (?<category>\w+(w\| )*), (\{[yY]:(?<year>\d+), *[vV]:(?<volume>(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))+)\}(, )?)+
但这没有帮助。
答案 0 :(得分:2)
编辑:您可以通过匹配所有内容进行简化,直到下一个逗号:[^,]*
。以下是与源数据匹配的完整代码段:
var testRegex = new Regex(@"
(?'name'[^,]*),\s*
(?'category'[^,]*),\s*
({y:(?'year'[^,]*),\s*
V:(?'volume'[^,]*),?\s*)*",
RegexOptions.IgnorePatternWhitespace);
var testMatches = testRegex.Matches(
"Sherwood, reciev, {y:2008,V:5528.35}, {y:2009,V:8653.89}, {y:2010, V:4290.51}");
foreach (Match testMatch in testMatches)
{
Console.WriteLine("Name = {0}", testMatch.Groups["name"].Value);
foreach (var capture in testMatch.Groups["year"].Captures)
Console.WriteLine(" Year = {0}", capture);
}
打印:
Name = Sherwood
Year = 2008
Year = 2009
Year = 2010
答案 1 :(得分:0)
我认为问题是逗号:
, \s* \}
哪个应该是可选的(或省略?):
,? \s* \}
答案 2 :(得分:0)
阐述MRAB所说的内容:
(?'name'
\w+
(?:
\w|\s
)*
),
\s*
(?'category'
\w+
(?:
\w|\s
)*
),
\s*
(?:
\{
\s*
[yY]:
(?'year'
\d+
),
\s*
[vV]:
(?'volume'
(?:
( # Why do you need capturing parenth's here ?
[1-9][0-9]*
\.?
[0-9]*
)
|
(
\.[0-9]+
)
)+
), # I'm just guessing this comma doesent match input samples
\s*
\}
\s*
,?
\s*
)*
Sherwood, reciever, {y:2008,V:5528.35}, {y:2009,V:8653.89}, {y:2010, V:4290.51}