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