SORU
18 Mayıs 2013, CUMARTESİ


\d daha az verimli [0-9]

Biri [0-9] yerine regular expression [0123456789] \d kullanmış bir cevap bir yorum dün yaptım. Muhtemelen daha etkili bir karakter kümesi daha bir dizi ya da sayı belirteci kullanmak için olduğunu söyledim.

Ben test etmeye karar verdin bugün öğrendim ve benim için sürpriz olan (C# düzenli ifade Motoru en az) \d görünür olmak daha verimli ya da diğer ikisi olan yok galiba çok farklı. Burada 5077 aslında bir basamak içeren 1000 rastgele 10000 rasgele dizeleri üzerinde test benim çıkış:

Regular expression \d           took 00:00:00.2141226 result: 5077/10000
Regular expression [0-9]        took 00:00:00.1357972 result: 5077/10000  63.42 % of first
Regular expression [0123456789] took 00:00:00.1388997 result: 5077/10000  64.87 % of first

İki nedenden dolayı benim için bir sürpriz oldu:

  1. Aralığı çok daha verimli bir şekilde birden yürürlüğe gireceğini düşünmüştüm.
  2. \d [0-9] daha kötü olduğunu anlayamıyorum. Sadece [0-9] steno daha 10 ** Daha fazla var mı?

Burada test kodu:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace SO_RegexPerformance
{
    class Program
    {
        static void Main(string[] args)
        {
            var rand = new Random(1234);
            var strings = new List<string>();
            //10K random strings
            for (var i = 0; i < 10000; i  )
            {
                //Generate random string
                var sb = new StringBuilder();
                for (var c = 0; c < 1000; c  )
                {
                    //Add a-z randomly
                    sb.Append((char)('a'   rand.Next(26)));
                }
                //In roughly 50% of them, put a digit
                if (rand.Next(2) == 0)
                {
                    //Replace one character with a digit, 0-9
                    sb[rand.Next(sb.Length)] = (char)('0'   rand.Next(10));
                }
                strings.Add(sb.ToString());
            }

            var baseTime = testPerfomance(strings, @"\d");
            Console.WriteLine();
            var testTime = testPerfomance(strings, "[0-9]");
            Console.WriteLine("  {0:P2} of first", testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
            testTime = testPerfomance(strings, "[0123456789]");
            Console.WriteLine("  {0:P2} of first", testTime.TotalMilliseconds / baseTime.TotalMilliseconds);
        }

        private static TimeSpan testPerfomance(List<string> strings, string regex)
        {
            var sw = new Stopwatch();

            int successes = 0;

            var rex = new Regex(regex);

            sw.Start();
            foreach (var str in strings)
            {
                if (rex.Match(str).Success)
                {
                    successes  ;
                }
            }
            sw.Stop();

            Console.Write("Regex {0,-12} took {1} result: {2}/{3}", regex, sw.Elapsed, successes, strings.Count);

            return sw.Elapsed;
        }
    }
}

CEVAP
18 Mayıs 2013, CUMARTESİ


\d [0-9] Bu 10 karakter ile sınırlı iken Unicode tüm basamaklar kontrol eder. Örneğin, Persian basamak ۱۲۳۴۵۶۷۸۹, \d ama [0-9] ile uyumlu olan Unicode basamaklı bir örnektir.

Tüm bu karakterler aşağıdaki kodu kullanarak bir liste oluşturabilirsiniz:

var sb = new StringBuilder();
for(UInt16 i = 0; i < UInt16.MaxValue; i  )
{
    string str = Convert.ToChar(i).ToString();
    if (Regex.IsMatch(str, @"\d"))
        sb.Append(str);
}
Console.WriteLine(sb.ToString());

Oluşturur:

0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯୦୧୨୩୪୫୬୭୮୯௦௧௨௩௪௫௬௭௮௯౦౧౨౩౪౫౬౭౮౯೦೧೨೩೪೫೬೭೮೯൦൧൨൩൪൫൬൭൮൯๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕໖໗໘໙༠༡༢༣༤༥༦༧༨༩၀၁၂၃၄၅၆၇၈၉႐႑႒႓႔႕႖႗႘႙០១២៣៤៥៦៧៨៩᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙0123456789

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • Google Россия

    Google Ро

    9 Temmuz 2007
  • thewinekone

    thewinekone

    17 Aralık 2005