关于正则表达式:正则表达式d是否与减号和/或小数点匹配?

Does regular expression d match minus sign and/or decimal point?

我看了一些旧的perl/cgi代码来调试一个问题,并注意到了以下许多用法:

1
2
\d - Match non-digit character
\D - Match digit character

大多数在线文档都提到d与[0-9]相同,这是我一直认为的。但是,我也注意到stackoverflow问题提到了字符集差异。

regex中的"d"是指数字吗?

d是否也匹配减号和/或小数点?

我要去做些测试。


Does \d also match a minus sign and/or decimal point?


我不知道Perl如何确定默认情况下是否使用Unicode、ASCII或区域设置(没有标志,没有use)。不管怎样,通过声明use re '/a';(ascii)、use re '/u';(unicode)或use re '/l';(locale),您将清楚地向perl解释器(和人类读卡器)表明您要使用哪种模式,并避免意外的行为。

由于修饰语的作用,\d至少有2种含义:

  • /a标志(ASCII)的作用下,\d将匹配09的数字(不多不少)。
  • /u标志(unicode)的作用下,\d将匹配任何语言中的任何十进制数字,并等同于\p{Digit}参考。这实际上使\d+相当无用,而且使用起来很危险,因为它允许在任何语言中混合数字。

    引自/u标志说明


    And, \d+ , may match strings of digits that are a mixture from different writing systems, creating a security issue. num() in Unicode::UCD can be used to sort this out. Or the /a modifier can be used to force \d to match just the ASCII 0 through 9.

\d将不匹配任何符号或标点,因为这些字符不属于Nd通用Unicode类别。


答案是否定的。它只做一个数字检查。然而,Unicode使事情变得更加复杂。

如果您想确保某个值是一个数字——一个十进制数字——请查看scalar::util模块。它具有的功能之一是look_like_number。这可以用来查看您正在查看的字符串是否可以是数字,并且比尝试使用正则表达式效果更好。

这个模块已经成为标准Perl的一部分有一段时间了,所以您应该在系统上使用它。