本文介绍了\\ d大于效率较低[0-9]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

昨天我在哪里有人用过一个答案做出评论 [0123456789] 中的而非 [0-9] \\ D 。我说,这可能是更有效的使用范围或数字说明不是字符集。

我决定今天测试并发现了令我惊讶的是(在C#正则表达式引擎至少) \\ D 似乎比任何的效率较低另外两个这似乎并没有太大的差别。这里是我的测试输出1000个随机字符超过10000的随机字符串与5077实际包含一个数字:

 正前pression \\ D拿了00:00:00.2141226结果:10000分之5077
普通的前pression [0-9]拿了00:00:00.1357972结果:首先10000分之507763.42%
普通的前pression [0123456789]拿了00:00:00.1388997结果:首先10000分之507764.87%

这是一个让我吃惊的原因有两个:


  1. 我本来以为会范围内更有效地比设定来实现。

  2. 我不明白为什么 \\ D 恶化[0-9] 。是否有更多的 \\ D 不是简单地简写 [0-9]

下面是测试code:

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Diagnostics程序;
使用System.Text.RegularEx pressions;命名空间SO_RegexPerformance
{
    类节目
    {
        静态无效的主要(字串[] args)
        {
            VAR兰特=新的随机(1234);
            VAR串=新的List<串GT;();
            // 10K随机字符串
            对于(VAR I = 0; I< 10000;我++)
            {
                //生成随机字符串
                VAR SB =新的StringBuilder();
                对于(VAR C = 0; C< 1000; C ++)
                {
                    //添加A-Z随机
                    sb.Append((char)的('A'+ rand.Next(26)));
                }
                //在其中的50%左右,把数字
                如果(rand.Next(2)== 0)
                {
                    //用数字替换一个字符,0-9
                    SB [rand.Next(sb.Length)] =(char)的('0'+ rand.Next(10));
                }
                strings.Add(sb.ToString());
            }            VAR baseTime = testPerfomance(字符串,@\\ D);
            Console.WriteLine();
            变种,原料与材料= testPerfomance(字符串,[0-9]);
            Console.WriteLine({0:P2}第一,testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
            原料与材料= testPerfomance(字符串[0123456789]);
            Console.WriteLine({0:P2}第一,testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
        }        私有静态时间跨度testPerfomance(列表<串GT;字符串,字符串的正则表达式)
        {
            变种SW =新的秒表();            诠释成功= 0;            VAR雷克斯=新的正则表达式(正则表达式);            sw.Start();
            的foreach(字符串中的VAR STR)
            {
                如果(rex.Match(STR).Success)
                {
                    成功++;
                }
            }
            sw.Stop();            Console.Write(正则表达式{0,} -12拿了{1}的结果:{2} / {3},正则表达式,sw.Elapsed,成功,strings.Count);            返回sw.Elapsed;
        }
    }
}


解决方案

\\ D 检查所有的的数字,而 [0-9] 仅限于这些10个字符。例如,数字, 123456789 ,是单向的例子这是与 \\ D匹配code数字,而不是 [0-9]

您可以生成使用以下code所有这些字符的列表:

  VAR SB =新的StringBuilder();
对于(UINT16我= 0; I< UInt16.MaxValue;我++)
{
    字符串str = Convert.ToChar(I)的ToString();
    如果(Regex.IsMatch(STR,@\\ D))
        sb.Append(STR);
}
Console.WriteLine(sb.ToString());

生成:

这篇关于\\ d大于效率较低[0-9]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-23 14:41