C# 关于正则表达式匹配组无错误的说明

C# 关于正则表达式匹配组无错误的说明,c#,regex,C#,Regex,我们有点困惑,为什么这段代码没有抛出任何错误,因为我们预期会出现索引自动异常异常 Regex re = new Regex(@"(\d+)"); Match result = re.Match("123456789"); Console.WriteLine(result.Groups[1000000000].Value); 有人能解释一下他的想法吗?组不是数组,它是索引属性。它可以返回任何东西,这取决于它的代码 public Group this[int groupnum] { get; }

我们有点困惑,为什么这段代码没有抛出任何错误,因为我们预期会出现
索引自动异常
异常

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

有人能解释一下他的想法吗?

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

public Group this[int groupnum] { get; }
来自MSDN的UPD:

您可以通过检索来确定集合中的项数 Count属性的值。groupnum的有效值 参数的范围为0到小于列表中项目数的1 收藏

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

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


我会把这归结为一个实现选择

不表示它抛出任何异常:即使
-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: ""
与此相反,这表明它可以抛出
索引自动弗兰基异常

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
也许有人可以深入了解原因,
GroupCollection
无例外地处理无意义,而
DataColumnCollection
有例外地处理相同的无意义,但我怀疑这与我们每个人选择编写一个简单字符串包含方法的方式没有什么不同(暂且不考虑BCL对此的支持):

vs


result.Groups[10000]
也不是空的吗?输出是什么?是的。一个
字符串的值。空的
是它的值。-1 OP是问为什么,而不是如何。你知道,甚至数组索引也被翻译成了一些代码。它可能被翻译成了不同的代码。这不是答案。更新后变成了+1。现在我们可能没有开发人员的原因,但是我们确实有解释用法的文档。我在MSDN文档中发现了这些注释,但我仍然不明白为什么。直到您解释了索引属性,这证明了我的正确性。谢谢!
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
}