2016-04-18 110 views
4

我嘗試拆分字符串A1B22C333以獲取數組[0] => A1,[1] => B22,[2] => C333。這是我的失敗嘗試:根據字母后跟數字拆分字符串

$mystring = "A1B22C333"; 
$pattern = "[\w\d+]"; 
$arr = preg_split("/".$pattern."/", $mystring); 
print_r($arr); 

,但我得到: Array ([0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] =>)

+0

有人可以幫助我重新命名的問題,以防止重複的標題? 編輯:Thx rock321957 – Black

回答

3

您可以使用正則表達式像

(?<!^)(?=\D) 

regex demo

(?<!^)(?=\D)匹配的位置不是在字符串的開頭和一個非數字字符之前。

IDEONE demo

$mystring = "A1B22C333"; 
$pattern = '~(?<!^)(?=\D)~'; 
$arr = preg_split($pattern, $mystring); 
print_r($arr); 
// => Array([0] => A1 [1] => B22 [2] => C333) 

您也可以縮短正則表達式來僅'~(?=\D)~'(位置的非數字前)如果你使用PREG_SPLIT_NO_EMPTYdemo):

$pattern = '~(?=\D)~'; 
$arr = preg_split($pattern, $mystring, -1, PREG_SPLIT_NO_EMPTY); 
+0

我以前從來沒有在正則表達式中看到'〜'字符,有人可以解釋它使用什麼嗎? – Black

+2

'〜'是一個正則表達式分隔符,與'/'相同,但是在模式中經常使用'/'(然後所有'/'必須在模式中被轉義),'〜'更方便使用分隔符。 –

+0

@EdwardBlack你可能已經像'/ regex /'一樣使用它了.. – rock321987

1

代替preg_split使用preg_match_all連同下面的正則表達式

([a-zA-Z]\d+) 

所以,你的代碼看起來像作爲

preg_match_all("/([a-zA-Z]\d+)/","A1B22C333",$m); 
print_r($m[0]); 

輸出:

Array 
(
    [0] => A1 
    [1] => B22 
    [2] => C333 
)