0
Regex regOrg = new Regex(@"org(?:aniser)?\s+(\d\d):(\d\d)\s?(\d\d)?\.?(\d\d)?", RegexOptions.IgnoreCase);
MatchCollection mcOrg = regOrg.Matches(str);
Match mvOrg = regOrg.Match(str);

dayOrg = mvOrg.Value[4].ToString();
monthOrg = mvOrg.Value[5].ToString();
hourOrg = mvOrg.Value[2].ToString();
minuteOrg = mvOrg.Value[3].ToString();

这个正则表达式用文本分析字符串

"organiser 23:59" / "organiser 25:59 31.12" 

或者

"org 23:59" / "org 23:59 31.12"

可选参数的日期和月份 因此,我想用这些数据查看输出变量 dayOrg、monthOrg、hourOrg、minuteOrg,但我得到了这个:

Query: org 23:59 31.12
The value mcOrg.Count: 1
The value dayOrg: 2
The value monthOrg: 3
The value hourOrg: g
The value minuteOrg: empty

我究竟做错了什么?尝试了很多选项,但它不起作用。

4

3 回答 3

2

您没有正确访问组(您正在访问匹配字符串的单个字符)。

dayOrg = mvOrg.Groups[4].Value;
monthOrg = mvOrg.Groups[5].Value;
hourOrg = mvOrg.Groups[2].Value;
minuteOrg = mvOrg.Groups[3].Value;
于 2013-05-26T12:18:30.653 回答
1

您获得该结果的原因是因为您从 mvOrg 匹配中获得了 Value[index]。

Match 类,如MSDN上所述,表示 Value 是第一个匹配项,因此您访问的是第一个匹配项的字符数组而不是组。您需要使用 Match 类的 Groups 属性来获取找到的实际组。

在尝试访问可选参数之前,请务必检查此集合的计数。

于 2013-05-26T12:20:28.120 回答
0

我为你的模式添加了名称,所以现在它看起来像这样:

            Regex regOrg = new Regex(@"org(?:aniser)?\s+(?<hourOrg>\d{2}):(?<minuteOrg>\d{2})\s?(?<dayOrg>\d{2})?\.?(?<monthOrg>\d{2})?", RegexOptions.IgnoreCase);

你可以像这样访问结果

        Console.WriteLine(mvOrg.Groups["hourOrg"]);
        Console.WriteLine(mvOrg.Groups["minuteOrg"]);
        Console.WriteLine(mvOrg.Groups["dayOrg"]);
        Console.WriteLine(mvOrg.Groups["monthOrg"]);

使用硬编码索引不是一个好习惯,因为您可以更改正则表达式,现在需要更改所有索引......
这是您想要的吗?

于 2013-05-26T12:26:40.907 回答