我正在查看一些旧的 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(不多也不少)。在/uflag (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 的一部分有一段时间了,所以你应该在你的系统上安装它。