2014-11-23 41 views
0

簡單,我想看看一個字段是否有9位數字,沒有別的。perl正則表達式使用重複/量詞

我是$ var = 123456789

(my $nine) = ($var =~ /\d{9}/);

從我的理解這個說, 「匹配一個數字的9倍,並沒有別的」

這個輸出1但不是我期待的123456789。爲什麼?

+0

,你表現出「產出」什麼聲明。你期望'九美元'包含'123456789'嗎?如果'$ var'設置爲''abcdef9873239998782116tyra'',你想要什麼? – Borodin 2014-11-23 23:13:43

回答

0

沒有什麼回來在列表環境正則表達式中,
所以默認是它將變量$nine設置爲正則表達式函數調用的標量結果
。並且該函數調用返回標量上下文
匹配的數量。

如果你要改變,要(my $nine) = ($var =~ /\d/g);
$其中9含有9

添加捕獲緩衝圍繞數字。

即:

(my $nine) = ($var =~ /(\d{9})/); 

然而,即使你對你的賦值語法將工作,
其傳統的把它寫爲

my ($nine) = $var =~ /(\d{9})/; 
+0

我是誰低估了你的答案的白癡。你錯了。 – Borodin 2014-11-23 23:06:05

+0

謝謝。你的工作是爲了我的需要。 – 2014-11-23 23:17:21

-1

你真的想這樣:

(my $nine) = ($var =~ /(\d{9})/); 

的問題是,=~是一個比較運營商,並表達($var =~ /\d{9}/)的結果爲真(1)。在我的例子中添加括號使得正則表達式捕捉到它的匹配,所以它返回你的123456789

+0

關注此問題的答案是否有誤? – nmarsh 2014-11-23 22:48:06

+0

OP要求檢查*「如果一個字段有9位數字而沒有其他」*。您的解決方案捕獲它找到的前九位數字字符,或者如果沒有這樣的子序列,則將「$ nine」設置爲「undef」。 – Borodin 2014-11-23 22:49:43

+0

@Borodin - OP明確指出問題是作業是'1'。他可以在任何地方找到9位數字,不是嗎? – sln 2014-11-23 23:01:35

1

你的格局九(國際)數字字符任何地方序列中的字符串相匹配。您所看到的1是一個true模式匹配返回的值說匹配成功。

如果你只是想驗證一個變量的內容是正是 9 ASCII數字,那麼你應該寫

if ($var =~ /\A[0-9]{9}\z/) { ... } 

,或者,如果您有可用的ASCII /a修飾符(任意版本Perl 5中的自14),那麼你可以說

if ($var =~ /\A\d{9}\z/a) { ... }