2014-01-08 108 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')。 –

相關問題