我正在查看一些旧的 PERL/CGI 代码来调试问题,并注意到有很多用途:
\d - Match non-digit character
\D - Match digit character
大多数在线文档都提到 \d 与 [0-9] 相同,这是我一直认为的。但是,我也注意到提到字符集差异的 Stackoverflow 问题。
\d 是否也匹配减号和/或小数点?
我要去做一些测试。
我正在查看一些旧的 PERL/CGI 代码来调试问题,并注意到有很多用途:
\d - Match non-digit character
\D - Match digit character
大多数在线文档都提到 \d 与 [0-9] 相同,这是我一直认为的。但是,我也注意到提到字符集差异的 Stackoverflow 问题。
\d 是否也匹配减号和/或小数点?
我要去做一些测试。
\d 是否也匹配减号和/或小数点?
我不知道 Perl 如何确定默认情况下是使用 Unicode 还是 ASCII 或语言环境(没有标志,没有use
)。无论如何,通过声明use re '/a';
(ASCII)、或use re '/u';
(Unicode) 或use re '/l';
(locale),您将清楚地向 Perl 解释器(和人类读者)表明您想要使用哪种模式并避免意外行为。
由于修饰语的作用,\d
至少有2个含义:
/a
标志(ASCII)的作用下,\d
将匹配从0
到的数字9
(不多也不少)。在/u
flag (Unicode) 的作用下,\d
将匹配任何语言中的任何十进制数字,相当于\p{Digit}
reference。这实际上使得\d+
使用起来非常无用和危险,因为它允许在任何语言中混合数字。
引用/u
标志的描述
并且 ,
\d+
可能会匹配来自不同书写系统的混合数字字符串,从而产生安全问题。num() in Unicode::UCD
可以用来解决这个问题。或者/a
修饰符可用于强制\d
仅匹配 ASCII 0 到 9。
\d
将不匹配任何符号或标点符号,因为这些字符不属于 Unicode 的Nd
(数字,十进制数字)通用类别。
答案是不。它只是进行数字检查。然而,Unicode 使事情变得更复杂一些。
如果您想确保某物是数字——十进制数字——请查看Scalar::Util模块。它的功能之一是look_like_number
. 这可用于查看您正在查看的字符串是否为数字,并且比尝试使用正则表达式效果更好。
这个模块已经成为标准 Perl 的一部分有一段时间了,所以你应该在你的系统上安装它。