\ d มีประสิทธิภาพน้อยกว่า [0-9]


1247

ผมได้แสดงความคิดเห็นเมื่อวานนี้ในคำตอบที่มีคนใช้[0123456789]ในการแสดงออกปกติมากกว่าหรือ[0-9] \dฉันบอกว่ามันอาจจะมีประสิทธิภาพมากกว่าในการใช้ตัวระบุช่วงหรือตัวเลขมากกว่าชุดอักขระ

ฉันตัดสินใจที่จะทดสอบในวันนี้และพบกับความประหลาดใจของฉันที่ (ใน C # regex engine อย่างน้อย) \dดูเหมือนว่าจะมีประสิทธิภาพน้อยกว่าอีกสองอันที่ดูเหมือนจะไม่แตกต่างกันมากนัก นี่คือผลการทดสอบของฉันมากกว่า 10,000 สายสุ่ม 1,000 ตัวอักษรแบบสุ่มกับ 5077 จริงประกอบด้วยตัวเลข:

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

มันเป็นเรื่องประหลาดใจสำหรับฉันด้วยเหตุผลสองประการ:

  1. ฉันคิดว่าช่วงจะใช้งานได้อย่างมีประสิทธิภาพมากกว่าชุด
  2. ผมไม่เข้าใจว่าทำไมเลวร้ายยิ่งกว่า\d [0-9]มี\dมากกว่าแค่การจดชวเลข[0-9]หรือไม่?

นี่คือรหัสทดสอบ:

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;
        }
    }
}

178
อาจ\dเกี่ยวข้องกับสถานที่ เช่นฮีบรูใช้ตัวอักษรเป็นตัวเลข
Barmar

6
ที่เกี่ยวข้อง: stackoverflow.com/a/6479605/674039
Wim

37
นี่เป็นคำถามที่น่าสนใจอย่างแม่นยำเพราะ\dไม่ได้หมายถึงสิ่งเดียวกันในภาษาต่าง ๆ ใน Java ตัวอย่างเช่น\dตรงกับ 0-9 เท่านั้น
Ray Toal

17
@Barmar Hebrew ไม่ใช้ตัวอักษรเป็นตัวเลข แต่โดยหลักจะเป็นตัวเลขละตินแบบเดียวกัน [0-9] ตัวอักษรสามารถใช้แทนตัวเลข แต่เป็นการใช้ที่หายากและสงวนไว้สำหรับคำศัพท์พิเศษ ฉันไม่คาดหวังว่าโปรแกรมแยกวิเคราะห์ regex จะจับคู่כ"יורדיסירה (โดยכ"גเป็นตัวสำรองสำหรับ 23) นอกจากนี้ตามที่เห็นได้ในคำตอบของ Sina Iravanian ตัวอักษรฮีบรูไม่ปรากฏว่าตรงกันสำหรับ \ d
Yuval Adam

7
การย้ายรหัสของ weston ไปยัง Java ให้ผล: - Regex \ d เอา 00: 00: 00.043922 ผลการค้นหา: 4912/10000 - Regex [0-9] เอา 00: 00: 00.073658 ผล: 4912/10000 167% ของแรก - Regex [ 0123456789] เอา 00: 00: 00.085799 ผล: 4912/10000 195% ของแรก
กลางวัน

คำตอบ:


1565

\dตรวจสอบตัวเลข Unicode ทั้งหมดในขณะที่[0-9]ถูก จำกัด ไว้ที่ 10 ตัวอักษรเหล่านี้ ยกตัวอย่างเช่นเปอร์เซียหลัก۱۲۳۴۵۶۷۸۹เป็นตัวอย่างของตัวเลข Unicode ซึ่งจะมีการจับคู่กับแต่ไม่\d[0-9]

คุณสามารถสร้างรายการของตัวละครทั้งหมดโดยใช้รหัสต่อไปนี้:

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());

ซึ่งสร้าง:

012345678901234567890123456789߀߁߂߃߄߅߆߇߈߉012345678 9 01২345678901234567890123456789୦୧୨୩୪୫୬୭୮୯ 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 ᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙0123456789


121
นี่คือรายการตัวเลขที่สมบูรณ์กว่าที่ไม่ใช่ 0-9: fileformat.info/info/unicode/category/Nd/list.htm
Robert McKee

8
@weston Unicode มี 17 ระนาบแต่ละ 16 บิต ตัวละครที่สำคัญที่สุดอยู่ในระนาบพื้นฐาน แต่ตัวละครพิเศษบางตัวส่วนใหญ่เป็นภาษาจีนอยู่ในระนาบเสริม การจัดการกับผู้ที่อยู่ใน C # นั้นค่อนข้างน่ารำคาญ
CodesInChaos

9
@RobertMcKee: Nitpick: ชุดอักขระ Unicode เต็มรูปแบบเป็นจริง 21 บิต (17 เครื่องบินจาก 16 บิตในแต่ละ) แต่แน่นอนว่า 21-bit-datatype นั้นไม่สามารถใช้งานได้ดังนั้นถ้าคุณใช้ power-of-2 datatype มันเป็นความจริงที่คุณต้องการ 32 บิต
sleske

3
จากบทความของ Wikipediaสมาคม Unicode ได้ระบุว่าขีด จำกัด ของรหัสจุด 1,114,112 (0 ถึง 0x010FFFF) จะไม่มีการเปลี่ยนแปลง มันเชื่อมโยงไปยัง unicode.org แต่ฉันไม่พบคำสั่งที่นั่น (ฉันอาจจะพลาด)
Keith Thompson

14
มันจะไม่เปลี่ยนแปลง - จนกว่าพวกเขาจะต้องเปลี่ยน
Robert McKee

271

ให้เครดิตกับ ByteBlast สำหรับการสังเกตในเอกสาร เพียงแค่เปลี่ยนคอนสตรัค regex:

var rex = new Regex(regex, RegexOptions.ECMAScript);

ให้เวลาใหม่:

Regex \d           took 00:00:00.1355787 result: 5077/10000
Regex [0-9]        took 00:00:00.1360403 result: 5077/10000  100.34 % of first
Regex [0123456789] took 00:00:00.1362112 result: 5077/10000  100.47 % of first

11
อะไรRegexOptions.ECMAScriptทำอย่างไร
เรนท์

7
จากตัวเลือกนิพจน์ปกติ : "เปิดใช้งานลักษณะการทำงานที่สอดคล้องกับ ECMAScript สำหรับนิพจน์"
chrisaycock

28
@ 0xFE: ไม่มาก การยกเว้น Unicode ยังคงใช้ได้ในECMAScript( \u1234) มันคือ "เพียงแค่" คลาสของตัวอักษรชวเลขที่เปลี่ยนความหมาย (เหมือน\d) และคุณสมบัติของ Unicode / ชวเลขสคริปต์ที่หายไป (เช่น\p{N})
ทิม Pietzcker

9
นี่ไม่ใช่คำตอบของส่วน "ทำไม" มันเป็นคำตอบ "แก้ไขอาการ" ข้อมูลที่มีค่ายังคง
usr

โดยทั่วไป Regrex รองรับการจับคู่ unicode แต่ ECMAScript ไม่ได้ ดังนั้นเมื่อใช้ RegexOptions.ECMAScript จะจับคู่กับ ascii เท่านั้นเช่น 0-9
lzlstyle

119

จาก"\ d" ใน regex หมายถึงตัวเลขหรือไม่ :

[0-9]\dจะไม่เทียบเท่ากับ [0-9]จับคู่เฉพาะ0123456789อักขระในขณะที่การ\dจับคู่[0-9]และตัวอักษรอื่น ๆ ตัวอย่างเช่นตัวเลขอารบิกตะวันออก٠١٢٣٤٥٦٧٨٩


49
ตามที่: msdn.microsoft.com/en-us/library/20bw873z.aspx If ECMAScript-compliant behavior is specified, \d is equivalent to [0-9].
ผู้ใช้ 12345678

2
ฮะฉันผิดหรือประโยคนี้จากลิงค์บอกตรงข้าม "\ d ตรงกับตัวเลขทศนิยมใด ๆ ซึ่งเทียบเท่ากับรูปแบบการแสดงออกปกติ \ p {Nd} ซึ่งรวมถึงเลขฐานสิบมาตรฐาน 0-9 เช่นเดียวกับตัวเลขทศนิยมของชุดอักขระอื่นจำนวนหนึ่ง"
İsmet Alkan

3
@ByteBlast ขอบคุณการใช้ตัวสร้าง: var rex = new Regex(regex, RegexOptions.ECMAScript);ทำให้พวกเขาทั้งหมดแยกไม่ออกในแง่ของประสิทธิภาพ
weston

2
โอ้ขอบคุณทุกคน คำถามนี้กลายเป็นการเรียนรู้ที่ยอดเยี่ยมสำหรับฉัน
İsmet Alkan

3
โปรดอย่า "เพียงแค่คัดลอก" คำตอบจากคำถามอื่น ๆ หากคำถามนั้นซ้ำซ้อนให้ตั้งค่าสถานะเช่นนั้น
BoltClock

20

นอกจากคำตอบยอดนิยมจากSina Iravianianแล้วนี่คือ. NET 4.5 รุ่น (เนื่องจากเฉพาะรุ่นที่รองรับเอาต์พุต UTF16, cf สามบรรทัดแรก) ของโค้ดของเขาโดยใช้จุดโค้ด Unicode แบบเต็ม เนื่องจากขาดการสนับสนุนที่เหมาะสมสำหรับเครื่องบิน Unicode ที่สูงขึ้นหลายคนไม่ทราบว่าจะตรวจสอบและรวมถึงเครื่องบิน Unicode บนเสมอ อย่างไรก็ตามบางครั้งพวกเขาก็มีตัวละครที่สำคัญ

ปรับปรุง

เนื่องจาก\dไม่รองรับอักขระที่ไม่ใช่ BMP ใน regex (ขอบคุณxanatos ) นี่เป็นรุ่นที่ใช้ฐานข้อมูลอักขระ Unicode

public static void Main()
{
    var unicodeEncoding = new UnicodeEncoding(!BitConverter.IsLittleEndian, false);
    Console.InputEncoding = unicodeEncoding;
    Console.OutputEncoding = unicodeEncoding;

    var sb = new StringBuilder();
    for (var codePoint = 0; codePoint <= 0x10ffff; codePoint++)
    {
        var isSurrogateCodePoint = codePoint <= UInt16.MaxValue 
               && (  char.IsLowSurrogate((char) codePoint) 
                  || char.IsHighSurrogate((char) codePoint)
                  );

        if (isSurrogateCodePoint)
            continue;

        var codePointString = char.ConvertFromUtf32(codePoint);

        foreach (var category in new []{
        UnicodeCategory.DecimalDigitNumber,
            UnicodeCategory.LetterNumber,
            UnicodeCategory.OtherNumber})
        {
        sb.AppendLine($"{category}");
            foreach (var ch in charInfo[category])
        {
                sb.Append(ch);
            }
            sb.AppendLine();
        }
    }
    Console.WriteLine(sb.ToString());

    Console.ReadKey();
}

ผลผลิตผลผลิตต่อไปนี้:

DecimalDigitNumber 0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८ ९ ০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯ ୦୧୨୩୪୫୬୭୮୯ ๐ ๐ ๐ ๒๑๓๓๔๕๕ ๖๗๘๙໐໑໒໓໔໕໖໗໘໙༠༡༢༣༤༥༦༧༨༩၀၁၂၃၄၅၆၇၈၉႐႑႒႓႔႕႖႗႘႙០១២៣៤៥៦៧៨៩ ᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙𐒠𐒡𐒢𐒣𐒤𐒥𐒦𐒧𐒨𐒩𑃰𑃱𑃲𑃳𑃴𑃵𑃶𑃷𑃸𑃹𑇐𑇑𑇒𑇓𑇔𑇕𑇖𑇗𑇘𑇙𑋰𑋱𑋲𑋳𑋴𑋵𑋶𑋷𑋸𑋹𑓐𑓑𑓒𑓓𑓔𑓕𑓖𑓗𑓘𑓙𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹𑣠𑣡𑣢𑣣𑣤𑣥𑣦𑣧𑣨𑣩𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿

LetterNumber

ᛮᛯᛰⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↅↆↇↈ〇〡〢〣〤〥〦〧〨〩〸〹〺ꛦꛧꛨꛩꛪꛫꛬꛭꛮꛯ𐅀𐅁𐅂𐅃𐅄𐅅𐅆𐅇𐅈𐅉𐅊𐅋𐅌𐅍𐅎𐅏𐅐𐅑𐅒𐅓𐅔𐅕𐅖𐅗𐅘𐅙𐅚𐅛𐅜𐅝𐅞𐅟𐅠𐅡𐅢𐅣𐅤𐅥𐅦𐅧𐅨𐅩𐅪𐅫𐅬𐅭𐅮𐅯𐅰𐅱𐅲𐅳𐅴𐍁𐍊𐏑𐏒𐏓𐏔𐏕𒐀𒐁𒐂𒐃𒐄𒐅𒐆𒐇𒐈𒐉𒐊𒐋𒐌𒐍𒐎𒐏𒐐𒐑𒐒𒐓𒐔𒐕𒐖𒐗𒐘𒐙𒐚𒐛𒐜𒐝𒐞𒐟𒐠𒐡𒐢𒐣𒐤𒐥𒐦𒐧𒐨𒐩𒐪𒐫𒐬𒐭𒐮𒐯𒐰𒐱𒐲𒐳𒐴𒐵𒐶𒐷𒐸𒐹𒐺𒐻𒐼𒐽𒐾𒐿𒑀𒑁𒑂𒑃𒑄𒑅𒑆𒑇𒑈𒑉𒑊𒑋𒑌𒑍𒑎𒑏𒑐𒑑𒑒𒑓𒑔𒑕𒑖𒑗𒑘𒑙𒑚𒑛𒑜𒑝𒑞𒑟𒑠𒑡𒑢𒑣𒑤𒑥𒑦𒑧𒑨𒑩𒑪𒑫𒑬𒑭𒑮

OtherNumber²³¹¼½¾৴৵৶.৸৹୲୳୴୵୶୷௰௱௲౸౹౺౻౼౽౾൰൱൲൳൴൵༪༫༬༭༮༯༰༱༲༳፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼៰៱៲៳៴៵៶៷៸៹᧚⁰⁴⁵⁶⁷⁸⁹₀₁₂₃₄₅₆₇₈₉⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟↉①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓⳽㆒㆓㆔㆕㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩㉈㉉㉊㉋㉌㉍㉎㉏㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿꠰꠱꠲꠳꠴꠵𐄇𐄈𐄉𐄊𐄋𐄌𐄍𐄎𐄏𐄐𐄑𐄒𐄓𐄔𐄕𐄖𐄗𐄘𐄙𐄚𐄛𐄜𐄝𐄞𐄟𐄠𐄡𐄢𐄣𐄤𐄥𐄦𐄧𐄨𐄩𐄪𐄫𐄬𐄭𐄮𐄯𐄰𐄱𐄲𐄳𐅵𐅶𐅷𐅸𐆊𐆋𐋡𐋢𐋣𐋤𐋥𐋦𐋧𐋨𐋩𐋪𐋫𐋬𐋭𐋮𐋯𐋰𐋱𐋲𐋳𐋴𐋵𐋶𐋷𐋸𐋹𐋺𐋻𐌠𐌡𐌢𐌣𐡘𐡙𐡚𐡛𐡜𐡝𐡞𐡟𐡹𐡺𐡻𐡼𐡽𐡾𐡿𐢧𐢨𐢩𐢪𐢫𐢬𐢭𐢮𐢯𐣻𐣼𐣽𐣾𐣿𐤖𐤗𐤘𐤙𐤚𐤛𐦼𐦽𐧀𐧁𐧂𐧃𐧄𐧅𐧆𐧇𐧈𐧉𐧊𐧋𐧌𐧍𐧎𐧏𐧒𐧓𐧔𐧕𐧖𐧗𐧘𐧙𐧚𐧛𐧜𐧝𐧞𐧟𐧠𐧡𐧢𐧣𐧤𐧥𐧦𐧧𐧨𐧩𐧪𐧫𐧬𐧭𐧮𐧯𐧰𐧱𐧲𐧳𐧴𐧵𐧶𐧷𐧸𐧹𐧺𐧻𐧼𐧽𐧾𐧿𐩀𐩁𐩂𐩃𐩄𐩅𐩆𐩇𐩽𐩾𐪝𐪞𐪟𐫫𐫬𐫭𐫮𐫯𐭘𐭙𐭚𐭛𐭜𐭝𐭞𐭟𐭸𐭹𐭺𐭻𐭼𐭽𐭾𐭿𐮩𐮪𐮫𐮬𐮭𐮮𐮯𐳺𐳻𐳼𐳽𐳾𐳿𐹠𐹡𐹢𐹣𐹤𐹥𐹦𐹧𐹨𐹩𐹪𐹫𐹬𐹭𐹮𐹯𐹰𐹱𐹲𐹳𐹴𐹵𐹶𐹷𐹸𐹹𐹺𐹻𐹼𐹽𐹾𑁒𑁓𑁔𑁕𑁖𑁗𑁘𑁙𑁚𑁛𑁜𑁝𑁞𑁟𑁠𑁡𑁢𑁣𑁤𑁥𑇡𑇢𑇣𑇤𑇥𑇦𑇧𑇨𑇩𑇪𑇫𑇬𑇭𑇮𑇯𑇰𑇱𑇲𑇳𑇴𑜺𑜻𑣪𑣫𑣬𑣭𑣮𑣯𑣰𑣱𑣲𖭛𖭜𖭝𖭞𖭟𖭠𖭡𝍠𝍡𝍢𝍣𝍤𝍥𝍦𝍧𝍨𝍩𝍪𝍫𝍬𝍭𝍮𝍯𝍰𝍱𞣇𞣈𞣉𞣊𞣋𞣌𞣍𞣎𞣏🄀🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊🄋🄌


สิ่งที่น่าเศร้าก็คือ Win32 Console จะไม่แสดงตัวอักษรตามปกติ
Sebastian

4
ถ้าฉันจำได้อย่างถูกต้องเศร้าใน. NET Regexไม่สนับสนุนอักขระที่ไม่ใช่ BMP ดังนั้นในตอนท้ายการตรวจสอบอักขระ> 0xffff ด้วย regex นั้นไร้ประโยชน์
xanatos

-1

\ d ตรวจสอบ Unicode ทั้งหมดในขณะที่ [0-9] ถูก จำกัด ไว้ที่ 10 ตัวอักษรเหล่านี้ ถ้าเพียง 10 หลักคุณควรใช้ คนอื่น ๆ ฉันแนะนำให้ใช้ \ d, เพราะเขียนน้อยกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.