【问题标题】:preg_match match a defined number of characters requiring at least one digit and at least one letterpreg_match 匹配定义数量的字符,需要至少一个数字和至少一个字母
【发布时间】:2013-05-27 19:27:49
【问题描述】:

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

如何更改此正则表达式以不匹配仅包含数字的字符串?

【问题讨论】:

  • 根据 SMS,唯一匹配的是时间字符串。

标签: php regex preg-match


【解决方案1】:

根据您描述的规则,$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
)

【讨论】:

  • @AbsoluteƵERØ ???,怎么会这样?我什至发布了运行和工作的示例代码。据我从 OP 的规则中可以看出,确实如此。
  • 没关系。期望它匹配我的字符串中的所有项目,您正在使用 preg_match,我加载了一个期望多个匹配项的字符串。 +1。
  • @JonathanKuhn,这是我的问题,我的正则表达式不应该匹配11111
【解决方案2】:

试试这个:

$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);

解释:

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

在这种情况下:

(?<= |^)  --> 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} 以及禁止前后所有非白色字符的第一个和最后一个环视。

【讨论】:

  • 在打印数组中似乎不起作用([0] => 11111 [1] => 11111)
  • @Cesar:重试,你必须只获取abcd4:a:1:
  • 是的,现在可以了。您介意解释一下您的正则表达式吗,至少这部分 (?&lt;= |^)(?= |$) 我认为其余部分相当于@Jonathan Kuhn 的回答,如果我错了,请纠正我。
  • @Cesar:不同之处在于模式允许使用非字母数字字符。
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2011-07-21
  • 2013-05-29
  • 2022-11-16
  • 2016-06-29
相关资源
最近更新 更多