2010-01-14 87 views

回答

5

試試這個正則表達式:

\b([a-z]+[0-9]+[a-z0-9]*|[0-9]+[a-z]+[a-z0-9]*)\b 

或者更緊湊:

\b([a-z]+[0-9]+|[0-9]+[a-z]+)[a-z0-9]*\b 

這符合所有單詞(注意這個詞邊界\b),要麼與一個或多個字母后跟一個或啓動更多的數字,反之亦然,後面跟着一個或多個字母或數字。所以至少一個字母和至少一個數字的條件總是滿足的。

+0

或者'\ b([a-z] + [0-9] + | [0-9] + [a-z] +)\ w * \ b'更加緊湊。 – tj111 2010-01-14 18:45:25

+1

@ tj111:根據定義,'\ w'不只是'[A-Za-z0-9]'。通常它裏面有更多的字符,比如'_'或其他不是ASCII字符的字符。 – Gumbo 2010-01-14 18:47:36

+0

只有前導字符是數字時纔有效。馬克的表達工作正常。 – manny 2010-01-14 19:03:55

0

這將返回所有單個字母數字字,您可以循環。我認爲正則表達式本身並不能完成整個工作。

\b[a-z0-9]+\b 

確保您標記,由於不區分大小寫。

+1

這將匹配'abc'和'123 ' – 2010-01-14 18:37:36

+0

我會嘗試新一輪的正則表達式寫作,但你可以在循環中手動測試。 – Matchu 2010-01-14 18:40:01

+0

我不希望它匹配abc和123只是a1bc3或1bac3。 – manny 2010-01-14 18:40:07

3

隨着向前看符號:

'/\b(?![0-9]+\b)(?![a-z]+\b)[0-9a-z]+\b/i' 

快速測試還示出了示例性的使用:

$str = 'foo bar F0O 8ar'; 
$arr = array(); 
preg_match_all('/\b(?![0-9]+\b)(?![a-z]+\b)[0-9a-z]+\b/i', $str, $arr); 
print_r($arr); 

輸出:

F0O 
8ar 
0
\b(?:[a-z]+[0-9]+|[0-9]+[a-z]+)[[:alnum:]]*\b 
相關問題