为何访问Regex GroupCollection越界索引不会抛出异常?
访问Regex.GroupCollection不存在的索引不抛越界异常的原因
GroupCollection不是通用的数组或列表集合,它是为正则匹配结果专门设计的特殊集合,索引越界不抛异常是官方刻意实现的既定行为,不是实现bug。
- 通用集合(比如普通数组、
List<T>)的索引器会严格校验传入的索引是否在0到集合长度-1的范围内,只要超出范围就直接抛出IndexOutOfRangeException。 GroupCollection的索引器做了定制逻辑:只要传入的索引是非负整数,哪怕索引值大于实际存在的分组总数,也不会触发越界异常,只会返回一个Success属性为false、Value为空字符串的空匹配组对象。
这种设计的目的是简化正则取值的代码逻辑:正则表达式里经常会出现可选分组、分组序号随正则调整变动的场景,如果每次取分组都要先判断分组总数是否足够、再判断分组是否匹配成功,会产生大量冗余的校验代码。现在的实现下,开发者不需要提前做索引越界判断,只要在拿到Group对象后检查Success属性,就能知道对应序号的分组是否匹配到了有效内容。
回到给出的示例代码:
var match = Regex.Match("", "a"); var test = match.Groups[6];
这里拿到的test是有效Group实例,不是null,也不会触发异常,可以正常访问它的所有属性,只是它的Success值为false,代表序号为6的分组没有匹配到任何内容。
补充边界说明:如果给索引器传入负数,才会抛出ArgumentOutOfRangeException,非负整数的越界场景统一返回空失败组,这个行为是.NET正则库的明确设计规范。
内容的提问来源于stack exchange,提问作者Router
相关产品推荐
相关产品推荐

