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

时间:2013-05-06 23:29:39

标签: regex perl

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

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

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

Does "\d" in regex mean a digit?

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

我要去做一些测试。

3 个答案:

答案 0 :(得分:11)

  

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

NO

答案 1 :(得分:7)

我不知道Perl如何确定是使用Unicode还是ASCII或默认情况下的语言环境 (无标志,没有use)。无论如何,通过声明use re '/a';(ASCII)或use re '/u';(Unicode)或use re '/l';(语言环境),您将向Perl解释器(和人类读者)清楚地表明您想要哪种模式使用并避免意外行为。

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

  • /a标记(ASCII)的影响下,\d会匹配09的数字(不多也不少)。
  • /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的一部分了,所以你应该在你的系统上使用它。