2015-04-15 208 views
0

我有這個字符串:sed將PHP的preg_match正則表達式

$str = "Samples read:   2748264 
     Length (seconds):  31.159456 
     Scaled by:   2147483647.0"; 

和命令行上,如果我想提取長度(秒)後的值:我可以用sed像這樣:

sed -n 's#^Length (seconds):[^0-9]*\([0-9.]*\)$#\1#p' 

我該如何將它重新格式化爲php的正則表達式匹配格式?我只需要在長度(秒)之後直接輸入數字,如果存在的話。

回答

1
preg_match('/Length \(seconds\):\s+(.*?)Scale/is', $str,$m); 
    echo $m[1]; 
+0

除了Scale之外,您可以使用'$'來到行尾。 – Devon

+0

剛剛在實際腳本中測試過 - 作品 –

+0

你說得對。我只是把它扔進一個沙箱,它就是這樣。我編輯了我的評論。由於某種原因沒有在liveregex上工作,我必須複製錯誤的正則表達式。 – Devon

0

sed使用的regex一些奇怪的(舊?)的變體,它需要逃脫括號,以創建一個組,讓他們轉義按字面解釋它們。

preg_match()使用Perl-Compatible Regular Expressions

你需要改變什麼:

  • 反轉括號的轉義;
  • 在你想要匹配的組中引用點(.)(否則它將匹配任何字符);我認爲它也應該引用sed;
  • 或者更改^$錨點以匹配輸入文本(它在行開頭處具有空格字符)或確保要匹配的字符串(Length)始終顯示爲輸入行中的開始行文本(無填充);我添加了一個非捕獲組((?:\s*)),以匹配行首的零個或多個空白字符;
  • 加上m修飾符(multi-line)允許^$在行首和行尾匹配;沒有它,它們只匹配輸入字符串的開始和結束。

代碼:

$str = "Samples read:   2748264 
     Length (seconds):  31.159456 
     Scaled by:   2147483647.0"; 

$matches = array(); 
if (preg_match_all('#^(?:\s*)Length \(seconds\):[^0-9]*([0-9\.]*)$#m', $str, $matches)) { 
    var_dump($matches[1]); 
} 

輸出是:

Array 
(
    [0] => 31.159456 
) 

如果你知道你要匹配的字符串輸入字符串中只出現一次(或者,如果你想匹配只有它的第一個外觀),那麼你可以使用preg_match()而不是preg_match_all(),它會在$matches[1]中存儲一個字符串(如果找到了匹配項)。