是从C#和#x27返回的数组的顺序;s Regex.Matches是否保证按文本顺序排列?

是从C#和#x27返回的数组的顺序;s Regex.Matches是否保证按文本顺序排列?,c#,regex,C#,Regex,我正在使用Regex.Matches()解析一个大文本文件中的一组匹配项 是否有关于此函数的文档可以保证Matches数组中的第一项与文本中的第一项匹配,Matches数组中的第二项与文本中的第二项匹配,依此类推 根据Regex.Match的文档,这似乎有很大的暗示,但我找不到证据证明Regex.Matches总是按照在文本中找到的顺序返回匹配项 编辑 我发现了一个整洁的网站,允许您浏览.NET源代码 从这里开始: 我们看到matches返回一个新的MatchCollection,它不做任何事情

我正在使用Regex.Matches()解析一个大文本文件中的一组匹配项

是否有关于此函数的文档可以保证Matches数组中的第一项与文本中的第一项匹配,Matches数组中的第二项与文本中的第二项匹配,依此类推

根据Regex.Match的文档,这似乎有很大的暗示,但我找不到证据证明Regex.Matches总是按照在文本中找到的顺序返回匹配项

编辑

我发现了一个整洁的网站,允许您浏览.NET源代码

从这里开始:

我们看到matches返回一个新的MatchCollection,它不做任何事情,因为它将执行推迟到使用它为止

我们看到MatchCollection的主要数据结构是ArrayList,它确实保证了顺序

    _regex = regex;
            _input = input;
            _beginning = beginning;
            _length = length;
            _startat = startat;
            _prevlen = -1;
#if SILVERLIGHT
            _matches = new List<Match>();
#else
            _matches = new ArrayList();
#endif
            _done = false;

这对我来说已经足够保证了。

不,没有保证。它将按照它想要的顺序返回它们,尽管它通常会按照找到它们的顺序返回它们。可能有一些例子是没有的。如果顺序绝对重要,则根据找到匹配项的位置对其进行排序


也就是说,我相信,除非您使用一些奇怪的负面外观延迟组合,否则当前的实现将始终按照它们在源代码中的顺序返回它们,但由于文档似乎不能保证这一点,这在将来可能会发生变化(例如,如果使用更高效的多线程正则表达式引擎)。即使这样,这种类型的更改也很可能会破坏太多东西,以至于只能使用某种标志来启用它。因此,您可以很安全地假设这一点,但这可能会发生变化。

虽然MSDN没有明确说明这一点,但很明显,匹配始终是有序的。MSDN描述了如何延迟加载
MatchCollection
对象。由于正则表达式模式总是以线性方式(从左到右或从右到左)处理,很难想象它们会以任何其他顺序延迟加载

例如,以下是一段摘录:

MatchCollection对象根据需要逐个匹配填充。它相当于正则表达式引擎反复调用Regex.Match方法并将每个匹配项添加到集合中。当通过集合的GetEnumerator方法访问集合时,或者使用foreach语句(在C#中)或For Each…Next语句(在Visual Basic中)访问集合时,使用此技术

如果这与反复调用match(将上一个匹配的结束位置作为下一个匹配的开始位置传递)相同,那么显然这意味着它们是有序的

当您将其与存在的
RegexOptions.RightToLeft
选项结合使用时,它将变为:

默认情况下,正则表达式引擎从左到右搜索。您可以使用RegexOptions.RightToLeft选项反转搜索方向。搜索自动从字符串的最后一个字符位置开始。对于包含起始位置参数的模式匹配方法,例如Regex.Match(String,Int32),起始位置是搜索开始时最右边字符位置的索引

即便如此,如果您不信任它,并且必须保证顺序,您可以按照
匹配.Index
属性对它们进行排序:

var matches = Regex.Matches(input, pattern).OrderBy(x=>x.Index);

始终以从左到右的线性方式处理RegexOptions。RightToLeft然后做什么?@PetSerAl很公平:)你的解决方案很聪明,我可以自己这样订购。谢谢啊,实现和API之间的区别。API不保证这一点,但当前的实现保证了这一点(只要不指定RightToLeft)。我仍然认为API故意含糊不清,因为它可能在将来某个日期发生变化。因此,如果您从未将.NET版本更新为实现发生更改的版本,您可以假设它始终是正常的。在延迟加载的集合中,很难想象有任何其他合理的实现会扰乱顺序。
var matches = Regex.Matches(input, pattern).OrderBy(x=>x.Index);