2014-01-08 40 views
2

我面临的字符串如下:为什么这个正则表达式无法工作......任何想法?

  • 开始行;
  • 字符CMPTKX,或Q;
  • 3个单词字符;
  • 任何数量的其他字符,除了换行符;
  • space;
  • 可能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); 
+2

您需要的分隔符'preg_match_all( '/正则表达式/',$主题,$ resultArr);'。 – Sam

+4

'&'是一个完全有效的分隔符 –

+0

'^'+匹配中的多个字符串=>我认为想要多行模式? '/ M'。 – Wrikken

回答

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); 
+0

@Wrikken是的,虽然他提到不应该有换行符,但这是可能的。我不知道这是否意味着整个字符串可能是多行的,但模式本身不应该有换行符,或者整个字符串是否应该是单行。 –

+0

说反正没有必要把它放得太温和;让他们在那里实际上是一个错误。你不应该在你想匹配的字母之前放置一个反斜杠,因为正则表达式会尝试将它们解释为转义序列(例如'\ K'和'Q')。 –

相关问题