2013-10-12 18 views
-1

我想匹配一個模式i2,3個數字,後面跟着一個破折號-和1到3個數字。獲取數量和模式限制

實例數據

i2123-1 
i2121-20 
i2111-331 
i2111 
i21111 
i2111-1141 

應該只匹配

i2123-1 
i2121-20 
i2111-331 

我試過,但它不匹配的一些模式,對有些比賽太多了。

preg_match_all('/i2\d{3}-\d{3}/', $str, $matches); 
+0

'/ i2 \ d {3} - \ d {3} /'與'太多'不匹配,它匹配' - '後的數字上限。它或者不匹配,沒有太多或者太少。如果「前」和「後」字符存在條件問題,則必須明確說明 – sln

回答

1

你需要改變你的最後\d{3}\d{1,3}破折號後接受1至3個數字。但即使如此,你仍然會比你想要的更多,我會在這個特定的情況下使用一個字邊界\b

preg_match_all('/\bi2\d{3}-\d{1,3}\b/', $str, $matches); 

live demo

0

你只需要作量詞接受較少使用{m,n}格式並使用一個單詞邊界:

/i2\d{3}-\d{1,3}\b/ 

或者,負前瞻,或錨(如果你不想匹配i2123-123-):

/i2\d{3}-\d{1,3}(?!.)/ 

/i2\d{3}-\d{1,3}$/  

你可能需要在最後一個多模式:

preg_match_all('/i2\d{3}-\d{1,3}$/m', $str, $matches); 

regex101 demo

如果你想絕對肯定沒有什麼別的在該模式中,使用錨和多模式(如果你還在一個字符串正在測試多行:

preg_match_all('/^i2\d{3}-\d{1,3}$/m', $str, $matches); 
0

我認爲正確的解決方案需要包括\b在模式的開頭一樣,所以我會用

preg_match_all('/\bi2\d{3}-\d{1,3}\b/', $str, $matches); 

測試此和其他反對這個樣本輸入發佈的解決方案:

i2123-1 
i2121-20 
i2111-331 
i2111 
i21111 
i2111-1141 
i2123-1 
1i2121-20 
ai2111-331 

看到這個demo