2

我需要一个正则表达式来提取 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)

我怎么能改变这个正则表达式不匹配一个只有数字的字符串?

4

2 回答 2

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
)
于 2013-05-31T22:18:40.123 回答
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},第一个和最后一个环视禁止前后的所有非白色字符。

于 2013-05-31T21:39:40.593 回答