Skip to main content
 首页 » 编程设计

regex之我应该使用\d 或 [0-9] 来匹配 Perl 正则表达式中的数字吗

2024年05月22日14kevingrace

在过去几周阅读了许多问题/答案后,我发现在 Perl 正则表达式中使用 \d 被评论为不正确。在 Perl 的更高版本中,\d[0-9] 不同,因为 \d 将表示任何 Unicode 字符具有数字属性,[0-9] 代表字符“0”、“1”、“2”、...、“9”。

我知道在某些情况下 [0-9] 是正确的使用方式,而在其他情况下 \d 则是正确的选择。我想知道哪些人认为使用的默认值是正确的?

我个人认为 \d 表示法非常简洁且富有表现力,而相比之下 [0-9] 则有些麻烦。但我在编写多语言代码方面缺乏经验,或者更确切地说,对不适合 ASCII 字符范围的语言进行代码编写,因此可能比较幼稚。

我注意到了

$find /System/Library/Perl/5.8.8/ -name \*pm | xargs grep '\\d' | wc -l 
  298 
$find /System/Library/Perl/5.8.8/ -name \*pm | xargs grep '\[0-9\]' | wc -l 
  26 

请您参考如下方法:

在我看来,使用 \d 非常危险,这是该语言的一个糟糕的设计决策,因为在大多数情况下您需要 [0-9]。霍夫曼编码将规定对 ASCII 数字使用 \d

之前的大多数发帖者已经强调了为什么应该使用 [0-9],所以让我给您提供更多数据:

  • 如果我正确地阅读了 unicode 图表,“70”是一个数字(印度语中的 70,不要相信我的话)。

  • 试试这个:

    $ perl -le '$one = chr 0xFF11; print "$one + 1 = ", $one+1;' 
    1 + 1 = 1 
    
  • 以下是有效数字的部分列表(可能会或可能不会在您的浏览器中正确显示,具体取决于您使用的字体),对于每个数字,只有第一个数字在以下情况下被解释为数字:用Perl做算术,如上所示:

     ZERO:  0٠۰߀०০੦૦୦௦౦೦൦๐໐0 
     ONE:   1١۱߁१১੧૧୧௧౧೧൧๑໑1 
     TWO:   2٢۲߂२২੨૨୨௨౨೨൨๒໒2 
     THREE: 3٣۳߃३৩੩૩୩௩౩೩൩๓໓3 
     FOUR:  4٤۴߄४৪੪૪୪௪౪೪൪๔໔4 
     FIVE:  5٥۵߅५৫੫૫୫௫౫೫൫๕໕5 
     SIX:   6٦۶߆६৬੬૬୬௬౬೬൬๖໖6 
     SEVEN: 7٧۷߇७৭੭૭୭௭౭೭൭๗໗7 
     EIGHT: 8٨۸߈८৮੮૮୮௮౮೮൮๘໘8 
     NINE:  9٩۹߉९৯੯૯୯௯౯೯൯๙໙9�� 
    

你还不相信吗?