首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从C#的Regex.Matches返回的数组顺序是否保证按文本的顺序排列?

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

Stack Overflow用户
提问于 2015-11-06 18:56:06
回答 2查看 1.9K关注 0票数 4

我使用Regex.Matches()来解析大文本文件中的一组匹配。

是否有任何关于此函数的文档可以保证匹配数组中的第一个项与文本中的第一个匹配项、匹配数组中的第二个项与文本中的第二个匹配项相对应,等等?

基于Regex.Match的文档,这似乎是非常隐含的,但我找不到证据表明Regex.Matches总是按照文本中找到的顺序返回匹配项。

编辑

我找到了一个整洁的网站,可以让你浏览.NET源代码。

所以从这里开始:http://referencesource.microsoft.com/#System/regex/system/text/regularexpressions/Regex.cs,8d8851eac21ceb80

我们看到匹配返回一个新的MatchCollection,它不会做任何事情,因为它推迟执行直到它被使用。

http://referencesource.microsoft.com/#System/regex/system/text/regularexpressions/RegexMatchCollection.cs,682620f47b442b05,references

我们看到,MatchCollection的主要数据结构是ArrayList,它保证订单。

代码语言:javascript
运行
复制
    _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;

并且GetMatch函数按照文本的顺序运行regex,将每个匹配添加到主数组中。

代码语言:javascript
运行
复制
Match match;

    do {
        match = _regex.Run(false, _prevlen, _input, _beginning, _length, _startat);

        if (!match.Success) {
            _done = true;
            return null;
        }

        _matches.Add(match);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-06 19:09:17

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

例如,下面是这篇MSDN文章的摘录

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

如果它与重复调用匹配相同(传递最后一场比赛的结束位置作为下一场比赛的开始位置),那么这显然意味着它们是有序的。

当您将其与RegexOptions.RightToLeft选项的存在相结合时,它将成为更清楚

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

即便如此,如果您不信任它,并且必须保证订单,则可以根据Match.Index属性对它们进行排序:

代码语言:javascript
运行
复制
var matches = Regex.Matches(input, pattern).OrderBy(x=>x.Index);
票数 5
EN

Stack Overflow用户

发布于 2015-11-06 19:03:21

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

尽管如此,我相信,除非您使用了一些奇怪的负面查找-后向组合,否则当前的实现将始终按照它们在源中的顺序返回它们,但是由于文档似乎不能保证返回它们,这在将来可能会改变(例如,如果使用更高效的多线程regex引擎)。即使如此,这种类型的改变很可能会破坏太多的东西,以至于只能用某种标志来启用。所以你很安全的假设,但这可能会改变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33573723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档