在过去几周阅读了许多问题/答案后,我发现在 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��
你还不相信吗?