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,唯一匹配的是时间字符串。