我想匹配一個模式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);
我想匹配一個模式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);
你需要改變你的最後\d{3}
到\d{1,3}
破折號後接受1至3個數字。但即使如此,你仍然會比你想要的更多,我會在這個特定的情況下使用一個字邊界\b
。
preg_match_all('/\bi2\d{3}-\d{1,3}\b/', $str, $matches);
你只需要作量詞接受較少使用{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);
如果你想絕對肯定沒有什麼別的在該模式中,使用錨和多模式(如果你還在一個字符串正在測試多行:
preg_match_all('/^i2\d{3}-\d{1,3}$/m', $str, $matches);
我認爲正確的解決方案需要包括\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。
'/ i2 \ d {3} - \ d {3} /'與'太多'不匹配,它匹配' - '後的數字上限。它或者不匹配,沒有太多或者太少。如果「前」和「後」字符存在條件問題,則必須明確說明 – sln