首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx.IsMatch() vs. String.ToUpper().Contains()性能

问RegEx.IsMatch() vs. String.ToUpper().Contains()性能
EN

Stack Overflow用户
提问于 2013-07-11 03:32:19
回答 3查看 3.9K关注 0票数 5

由于.NET中没有不区分大小写的string.Contains() (但string.Equals()的不区分大小写版本让我感到困惑,但我离题了),使用RegEx.IsMatch()和使用String.ToUpper().Contains()之间的性能差异是什么

示例:

代码语言:javascript
复制
string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";

bool containsString = RegEx.IsMatch(testString, "string", RegexOptions.IgnoreCase);
bool containsStringRegEx = testString.ToUpper().Contains("STRING");

我总是听说string.ToUpper()是一个非常昂贵的调用,所以当我想进行string.Contains()比较时,我会避免使用它,但是RegEx.IsMatch()在性能方面如何比较呢?

有没有更有效的方法来做这样的比较?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-11 03:38:52

这是一个基准测试

代码语言:javascript
复制
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";

        sw.Start();
        var re = new Regex("string", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
        for (int i = 0; i < 1000000; i++)
        {
            bool containsString = re.IsMatch(testString);
        }
        sw.Stop();
        Console.WriteLine("RX: " + sw.ElapsedMilliseconds);

        sw.Restart();
        for (int i = 0; i < 1000000; i++)
        {
            bool containsStringRegEx = testString.ToUpper().Contains("STRING");
        }


        sw.Stop();
        Console.WriteLine("Contains: " + sw.ElapsedMilliseconds);

        sw.Restart();
        for (int i = 0; i < 1000000; i++)
        {
            bool containsStringRegEx = testString.IndexOf("STRING", StringComparison.OrdinalIgnoreCase) >= 0 ;
        }


        sw.Stop();
        Console.WriteLine("IndexOf: " + sw.ElapsedMilliseconds);
    }
}

结果是

IndexOf (183毫秒)>包含(400毫秒)>正则表达式(477毫秒)

(使用编译后的Regex更新输出时间)

票数 16
EN

Stack Overflow用户

发布于 2013-07-11 03:36:48

还有另一个使用String.IndexOf(String,StringComparison)的版本,它可能比您建议的两个版本中的任何一个更有效:

代码语言:javascript
复制
string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";
bool contained = testString.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

如果需要区分区域性的比较,请使用CurrentCultureIgnoreCase而不是OrdinalIgnoreCase。

票数 10
EN

Stack Overflow用户

发布于 2013-07-11 03:40:45

根据个人使用正则表达式解析器的经验,我预计RegEx.match会很慢。但正如许多人所提到的,剖析它是确定答案的最好方法。我不得不修复与正则表达式解析器相关的性能问题,toLower和toUpper再也没有回来咬我。

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

https://stackoverflow.com/questions/17579368

复制
相关文章

相似问题

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