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

Php preg_match匹配至少需要一个数字和一个字母的定义数量的字符,php,regex,preg-match,Php,Regex,Preg Match,我需要一个正则表达式来提取代码, 这些要求是: 它必须有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'

我需要一个正则表达式来提取代码, 这些要求是:

  • 它必须有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)
如何将此正则表达式更改为不匹配仅包含数字的字符串?

尝试以下操作:

$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);
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);
字符类:

\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}
强制的,并且第一个和最后一个查找禁止前后的所有非白色字符。

根据您描述的规则,
$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的示例字符串:

输出:

//Your example string:
Array
(
)

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

在prints数组中似乎不起作用([0]=>11111[1]=>11111)@Cesar:retry,您必须仅获得
abcd4
:a:1:
是,现在它可以工作了。请您解释一下您的正则表达式,至少这部分
(?@Cesar:不同之处在于模式允许非字母数字字符。@AbsoluteƵERØØ???,这是怎么回事?我甚至发布了运行和工作的示例代码。根据OP的规则,它可以。无所谓。如果希望它匹配我字符串中的所有项目,您使用的是preg_match,我加载了一个需要多个匹配项的字符串。+1.@JonathanKuhn,当然这是我的问题,我的正则表达式匹配
11111
,而它不应该基于SMS,唯一匹配的是时间字符串。