2013-10-19 41 views
0

我有以下字符串:可選防止通配符結束的字符串被匹配

12345 This could be anythingREMOVE 

我需要匹配12345This could be anything。不幸的是,我需要解析的格式在該行末尾有一個字符串,並不總是存在(在本例中爲REMOVE)。如何在沒有REMOVE的情況下與我所尋找的相匹配?我嘗試了以下模式:

^(\d{5}) (.*)(?:REMOVE|$) 

不幸的是,REMOVE由通配符回升:

(
    [0] => Array 
     (
      [0] => 12345 This could be anythingREMOVE 
     ) 

    [1] => Array 
     (
      [0] => 12345 
     ) 

    [2] => Array 
     (
      [0] => This could be anythingREMOVE 
     ) 

) 

回答

1

你可以試試這個正則表達式:

^(\d{5})((?:.(?!REMOVE))+.) 

如何使用

  1. ^(\d{5}) - 比賽開始的字符串,之後爲五數字[0-9]。一組圓括號用於捕獲匹配的文本。
  2. ((?:.(?!REMOVE))+ - 匹配任何字符,如果沒有立即跟上sedence REMOVE一次或多次。它停在nanything。它不能匹配g因爲後跟REMOVE

  3. .) - 允許g匹配。

+1

這完美的作品!謝謝。 – Brad

+0

不客氣! –

2

如果最後一個字符串REMOVE是可選的,那麼爲什麼不能用使用正則表達式htis:

"/^(\d{5}) /" 

但是,如果你真的想避免REMOVE匹配模式,然後使用這個:

$s = '12345 This could be anythingREMOVE'; 
if (preg_match("/^(\d{5}) (.*?)(?:REMOVE|)$/", $s, $arr)) 
    var_dump($arr); 

輸出:

array(3) { 
    [0]=> 
    string(34) "12345 This could be anythingREMOVE" 
    [1]=> 
    string(5) "12345" 
    [2]=> 
    string(22) "This could be anything" 
} 
+0

我需要匹配「這可能是任何東西」以及。有時它最後有'REMOVE',有時它沒有。無論哪種方式,我都不想在比賽中使用REMOVE。 – Brad

+0

好吧,現在檢查編輯後的代碼。 – anubhava

+0

謝謝@anubhava。如果我按照原樣使用第二行,那麼「這可能是任何事情」都不匹配。如果我將它修改爲'^(\ d {5})(。*)(?=(?: REMOVE)?)$',索引2仍然包含'This might be anythingREMOVE'。 – Brad