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

在过去的几周中,阅读了许多问题/答案后,我发现\d在perl正则表达式中使用注释不正确。与在更高版本的perl中不同的\d是[0-9],\d它将代表具有digit属性的任何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


茅侃侃
浏览 1169回答 3
3回答

一只萌萌小番薯

为了最大程度的安全,我建议[0-9]您在不特别希望匹配所有unicode定义的数字的情况下使用。每的perldoc perluniintro,Perl不支持使用比其他数字[0-9]的号码,所以我肯定会使用[0-9]如果以下都为真:您希望将结果用作数字(例如,对其执行数学运算或将其存储在仅接受适当数字的位置(例如,数据库中的INT列))。非数字[^0-9]可能以正则表达式可以匹配它们的方式出现在数据中。(请注意,对于不受信任/敌对的输入,应始终将此选项视为true。)如果其中任何一个为假,则几乎没有理由专门不使用它\d(并且您可能会知道何时是这种情况),并且如果您尝试匹配所有Unicode定义的数字,则说明我一定要用\d。

慕尼黑5688855

根据perlreref的说法,“ \d”是可识别语言环境和Unicode的。但是,如果您使用的代码集不是Unicode,则无需担心Unicode数字,并且如果您使用的代码集类似于Latin-1(ISO 8859-1或8859-15),则因为代码集不包含任何其他数字字符,所以区域设置意识也不会伤害您。因此,对于许多人来说,在很多时候,您可以\d不用担心而使用' '。但是,如果Unicode数据是您工作的一部分,那么您需要更仔细地考虑要做什么。
打开App,查看更多内容
随时随地看视频慕课网APP