为什么这个正则表达式无法工作...任何想法?

时间:2014-01-08 00:53:40

标签: php regex

我面对的字符串如下:

  • 行首;
  • 字符CMPTKXQ;
  • 另外3个字符;
  • 除换行之外的任意数量的其他字符;
  • 空间;
  • 可能M字面;
  • 2位数;
  • /;
  • 可能M字面;
  • 2或3位数;
  • 空间。

我几乎可以肯定我已将其正确地转换为以下正则表达式,但这行PHP代码在传递有效字符串时仍返回NULL。此外,当我使用regexpal和相同的主题字符串测试此正则表达式时,将返回正确的结果。我很确定我遇到了模式分隔符或前两组的问题(行开始然后是字符检查)。有任何想法吗? - 布兰登

preg_match_all('&^(\C|\M|\P|\T|\K|\X|\Q)[A-Z0-9]{3}.*\sM?[0-9]{2}/M?[0-9]{2,3}\s&', $subject, $resultArr);

1 个答案:

答案 0 :(得分:2)

首先,我建议使用更常见的模式分隔符,例如/#~。我个人实际上不会在这里使用/,因为你在模式中使用它。这只是偏好,&完全有效。

其次,不需要反斜杠和行开头的字符(你也可以使用这些字符类,我发现它们更具可读性)。如图所示,其中一些确实构成了有效的转义序列,因此您可能会遇到不可预测的行为。

第三,我猜你想要一个不合格的搜索(模式后的U模式修饰符)。我发现在大多数情况下,当在模式中的某处使用.*时,这是期望的行为。在这种情况下,由于您正在使用preg_match_all()贪婪搜索特别成问题,因为它将匹配模式的第一部分与最后一个案例匹配的第一个案例,模式的最后部分与所有模式匹配其他潜在的匹配集中在模式的.*部分。

所以这给我们带来了类似的东西:

$pattern = '#^[CMPTKXQ][A-Z0-9]{3}.*\sM?[0-9]{2}/M?[0-9]{2,3}\s#U';
preg_match_all($pattern, $subject, $resultArr);