2013-05-06 151 views
2

我看一些老的Perl/CGI代码调试的问题,发现很多用途:正则表达式 d匹配减号和/或小数点吗?

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

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

Does "\d" in regex mean a digit?

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

我打算做一些测试。

+2

使用'[+ - ]?\ d +(?:\。\ d +)?'来匹配减号加号或小数点... – HamZa 2013-05-06 23:42:04

+0

我正在考虑更严格的事情,例如/^[0- 9] + $ /,这应该从一开始到最后一个或多个0-9匹配。 – jjwdesign 2013-05-06 23:47:13

+0

虽然你想匹配十进制(+ - )数字:p如果你只想匹配数字,那么'/^\ d + $ /'很好。 – HamZa 2013-05-06 23:52:24

回答

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标志

    而且,\d+,说明

    报价可以匹配的是来自不同的书写系统的混合数字字符串,创建一个安全问题。可以用num() in Unicode::UCD来解决这个问题。或者/a修改器可以使用到9

  • 迫使 \d匹配只是ASCII 0

\d不会匹配任何标志或标点,因为这些字符不属于Nd(数字,十进制数)Unicode的General Category

+0

你认为\ D(匹配非数字字符)是“危险使用”吗? – jjwdesign 2013-05-07 00:12:30

+0

@ikegami:使用标志将设置行为。但是,默认行为是什么 - 如果我们不设置任何东西,Perl会从哪里获得设置? – nhahtdh 2013-05-07 04:13:47

+0

@jjwdesign:如果您在验证正则表达式中使用它,那么您想要查看它。无论您使用的是哪个标志,\ D都将匹配Unicode字符。 – nhahtdh 2013-05-07 04:18:17

10

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

NO

+4

+1 LOUD BREVITY – pilcrow 2013-05-07 01:02:20

+1

当我读到这个时,我忍不住拍了他的个人资料图片中的那个孩子说出来......哈哈 – tjwrona1992 2016-05-13 15:12:22

3

答案是否定的。它只是做一个数字检查。但是,Unicode使事情变得更加复杂。

如果您想确定某个数字是十进制数字,请查看Scalar::Util模块。其中的一个功能是look_like_number。这可以用来查看您正在查看的字符串是否可以是数字,并且比尝试使用正则表达式更好。

这个模块一直是标准Perl的一部分,所以你应该在你的系统上安装它。