2010-01-14 156 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 
相关问题