2

我正在查看一些旧的 PERL/CGI 代码来调试问题,并注意到有很多用途:

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

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

正则表达式中的“\d”是否表示数字?

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

我要去做一些测试。

4

3 回答 3

11

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

于 2013-05-06T23:39:51.023 回答
8

我不知道 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(数字,十进制数字)通用类别

于 2013-05-06T23:39:23.980 回答
3

答案是不。它只是进行数字检查。然而,Unicode 使事情变得更复杂一些。

如果您想确保某物是数字——十进制数字——请查看Scalar::Util模块。它的功能之一是look_like_number. 这可用于查看您正在查看的字符串是否为数字,并且比尝试使用正则表达式效果更好。

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

于 2013-05-07T04:17:50.097 回答