2013-05-31 48 views
2

我想:匹配字符串格式的正則表達式 「1,22,3,44」

preg_match("/((\d)+,?)+/",$string) 

它返回正確的結果爲:

1,2,3,4,5

,但它也有相匹配:

1,2A

1aaaa

1,2,3,

我怎樣才能解決這個問題?

+0

你想匹配'1,22,3,44'或'1,2,3,4'?你只是想匹配逗號分隔的數字嗎? – crush

+0

我只是想匹配以逗號分隔的數字,而不是以逗號結尾 –

回答

0

試試這個:

preg_match('~^(?:\d+(?:,(?!$)|$))+$~', $string); 
+1

這對於一件簡單的事情來說是一個怪異的正則表達式。 – crush

+0

一個可怕的正則表達式。 –

+0

這是工作..但我不知道什麼是'〜'...我要學習更多..謝謝! –

1

您可以使用錨^$防止其他比賽:

preg_match("/^((\d)+,?)+$/",$string) 
      ^  ^

雖然......你的表達可能是這樣的美好:

preg_match("/^\d+(,\d+)*$/",$string) 

什麼用((\d)+,?)+情況是,它匹配它找到的前幾個字符,一旦完成,就表示匹配。

錨點^$分別表示字符串的開始和字符串的結束,意思是開始必須匹配直到結束。

+5

'1 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,' –

3

你可以對字符串和數字的開始做

^\d+(,\d+)*$ 

第一^\d+比賽。然後,您可以選擇匹配逗號後跟一個數字(並且該組可以出現0次或多次)。最後匹配字符串的末尾$。確保最後一個號碼後沒有任何內容。

這裏是表示表達如何工作的狀態機:

Regular expression image

Edit live on Debuggex

這可匹配,例如:81,2,4
但不會匹配:8,,21,2a

+0

對不起,不把它放回到php cpde,但寫手機已經夠難了! –

+0

我忘了提及那個字符串也有效,即使是單個號碼 –

+0

我仍然認爲這是一個更好的答案。輕鬆修改以接受字母數字字符。 – crush

相關問題