我需要一个正则表达式来提取code_number, 要求是:
理想情况下,这应该只使用一个正则表达式。
使用以下正则表达式我几乎就在那里,问题是这个正则表达式不符合第三个要求,它不应该与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)
如何将此正则表达式更改为不匹配仅限数字的字符串?
答案 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}
强制执行,第一个也是最后一个环视禁止前后所有非白色字符。