preg_match匹配需要至少一个数字和至少一个字母的定义数量的字符

时间:2013-05-31 21:34:50

标签: php regex preg-match

我需要一个正则表达式来提取code_number, 要求是:

  • 长度必须为5个字符
  • 任何位置必须至少包含一位数字
  • 任何位置必须至少包含一个字母

理想情况下,这应该只使用一个正则表达式。

使用以下正则表达式我几乎就在那里,问题是这个正则表达式不符合第三个要求,它不应该与11111匹配,因为缺少至少一个字母

$regex = '~\b(?=[a-zA-Z0-9]{5}\b)[a-zA-Z0-9]*\d[a-zA-Z0-9]*~';
$sms = ' 11111 keyrod  07:30 02.10.2013';

preg_match($regex, $sms, $matches);

print_r($matches); // print array([0] => 11111)

如何将此正则表达式更改为不匹配仅限数字的字符串?

2 个答案:

答案 0 :(得分:2)

根据您描述的规则,$sms字符串中的任何内容都不匹配。但根据这些规则,试试这个:

preg_match('~\b(?=[a-z0-9]{0,4}[a-z])(?=[a-z0-9]{0,4}[0-9])[a-z0-9]{5}\b~i', $subject, $matches);

使用示例字符串和Casimir的示例字符串:http://codepad.viper-7.com/NA2mI5

输出:

//Your example string:
Array
(
)

//Other sample string:
Array
(
    [0] => abcd4
)

答案 1 :(得分:1)

试试这个:

$subject = ' :::5: abcde4 abcd4 12345 abcde :a:1:';

$regex = '~(?<= |^)(?=\S{0,4}\d)(?=\S{0,4}[a-z])\S{5}(?= |$)~i';

preg_match_all($regex, $subject, $matches);

print_r($matches);

说明:

(?<=)(?=)分别是lookbehind和lookahead断言。他们在之前或之后测试条件并且不吃任何字符。 (它们是零宽度)

在这种情况下:

(?<= |^)  --> a space or the beginning of the string before
(?= |$)   --> a space or the end of the string after

角色类:

\S  --> all characters that are not white (space, tab, newline..)

条件:

前瞻强制至少有一个数字:

(?=\S{0,4}\d)有0到4个非空白字符和一个数字。换句话说,你可以:

1
x1
xx1
xxx1
xxxx1

对于(?=\S{0,4}[a-z])

的字母,它们是相同的

字符串的字符数用\S{5}强制执行,第一个也是最后一个环视禁止前后所有非白色字符。