2

我们有点困惑,为什么这段代码没有像我们预期的那样抛出任何错误IndexOutOfRangeException

Regex re = new Regex(@"(\d+)");
Match result = re.Match("123456789");
Console.WriteLine(result.Groups[1000000000].Value);

谁能解释一下他的想法?

4

2 回答 2

4

Groups 不是数组,它是索引属性。它可以返回任何东西取决于它的代码。

public Group this[int groupnum] { get; }

来自 MSDN 的 UPD:

您可以通过检索 Count 属性的值来确定集合中的项目数。groupnum 参数的有效值范围从 0 到比集合中的项目数小一。

Match.Groups 属性返回的 GroupCollection 对象始终至少有一个成员。如果正则表达式引擎在特定输入字符串中找不到任何匹配项,则集合中的单个 Group 对象将其 Group.Success 属性设置为 false,并将其 Group.Value 属性设置为 String.Empty。

如果 groupnum 不是集合成员的索引,或者如果 groupnum 是输入字符串中未匹配的捕获组的索引,则该方法返回 Group 对象,其 Group.Success 属性为 false 且其 Group。值属性是 String.Empty

于 2013-05-06T05:21:35.490 回答
0

我只是将其归结为实施选择。

GroupCollection.Item 属性 (Int32) 文档并未表明它会引发任何异常:甚至-1可以:

Regex re = new Regex(@"(\d+)");
Match result = re.Match("123456789");
Console.WriteLine(result.Groups[1000000000].Value); // works: ""
Console.WriteLine(result.Groups[0].Value); // works: "123456789"
Console.WriteLine(result.Groups[-1].Value); // works: ""

将此与DataColumnCollection.Item Property (Int32) 文档进行对比,这表明它可以抛出IndexOutOfRangeException

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("A"));
DataColumn existent = dt.Columns[0]; // works
DataColumn nonexistent = dt.Columns[1]; // doesn't work - IndexOutOfRangeException

也许有人可以提供洞察力的原因(S)GroupCollection处理废话没有例外,并DataColumnCollection处理同样的废话有一个例外,但我怀疑这与我们每个人可能选择编写一个简单的字符串包含方法(撇开BCL 已经对此提供支持):

bool StringContains(string inString, string lookForString)
{
    if (inString.IsNullOrEmpty)
        return false;

    // blah
}

对比

bool StringContains(string inString, string lookForString)
{
    if (inString == null)
        throw new ArgumentNullException("inString");
    if (inString.Length == 0)
        throw new ArgumentException("inString cannot be empty.");

    // blah
}
于 2013-05-06T05:45:03.083 回答