2014-02-05 51 views
2

我面臨的Perl的行爲開始忽略減去,我無法解釋: d +正則表達式在

#!/usr/bin/perl 

use strict; 
use warnings; 

my $number = -10; 
if ($number =~ /\d+/) { 
    print $number; 
} 

這將打印-10,儘管事實上,

  • \ d表示[ 0-9]

爲什麼在開始時忽略減號?

+2

'\ d'並不總是與'[0-9]'相同,請參閱http://stackoverflow.com/q/890686/372239 – Toto

+0

@ M42因此,\ d也可以匹配希伯來語,亞美尼亞語和其他非標準數字,出現在Unicode表格中? – user4035

+0

@ M42哪個Perl版本使用'/ a'修飾符開始? –

回答

6

您應該匹配對字符串的開頭也有^:

if ($number =~ /^\d+/) { 
+0

是的,當然。要匹配整個字符串,我應該使用^ \ d + $ – user4035

2

減是一個符號,而不是數量,所以使用:

if ($number =~ /^-?\d+$/) { 
    print $number; 
} 

-?即負-符號能滿足一個或零次

+0

也許最好是使用捕獲組並打印'$ 1',否則這將是我的首選答案:) – hochl

+0

您的意思是'/^- ?(\ d +)$ /'?你想在哪裏使用'$ 1'? –

+0

不喜歡'/ ^( - ?\ d +)/'並使用'$ 1'來查看匹配的內容,但無論如何。 – hochl

0

無論\ d +或[0-9] +的目的是什麼,它只做正確的事情。這取決於你的要求,你想要什麼像混合整數或只是負數匹配或正數匹配或開始,結束,任何地方等所有取決於你想要開發的模式。

1

你可以寫爲

if ($number and $number !~ /\D/) { 
    print $number; 
} 

,檢查該字符串不是零長度的,不包含任何非數字字符。

相關問題