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