2013-10-23 38 views
0

我有以下的輸出(字符串變量)與進程列表:如何用正則表達式獲得每行的第二個單詞?

chrome.exe     1680 RDP-Tcp#0     1 104,552 K 
chrome.exe     8944 RDP-Tcp#0     1 133,680 K 
csrss.exe      8880 Console     19  3,796 K 
winlogon.exe     6728 Console     19  4,484 K 
LogonUI.exe     9024 Console     19  19,552 K 
dwm.exe      11476 Console     19  19,916 K 
rdpclip.exe     8152 RDP-Tcp#0     1  8,240 K 

我怎麼能提取所有的PID使用正則表達式(PHP)?

謝謝。

回答

2

您可以使用此模式:

preg_match_all('~^\S+\s+\K\d+~m', $subject, $matches); 
print_r($matches); 

\K復位之前所有的比賽。

+0

謝謝,非常優雅的解決方案。 – MarkL

2

/^[^\s]+\s+([0-9]+)/m應該很好地工作:

<?php 
    $string = " 
chrome.exe     1680 RDP-Tcp#0     1 104,552 K 
chrome.exe     8944 RDP-Tcp#0     1 133,680 K 
csrss.exe      8880 Console     19  3,796 K 
winlogon.exe     6728 Console     19  4,484 K 
LogonUI.exe     9024 Console     19  19,552 K 
dwm.exe      11476 Console     19  19,916 K 
rdpclip.exe     8152 RDP-Tcp#0     1  8,240 K 
    "; 

    if (preg_match_all("/^[^\s]+\s+([0-9]+)/m", $string, $matches)) { 
     print_r($matches[1]); 
     /* 
      Array 
      (
       [0] => 1680 
       [1] => 8944 
       [2] => 8880 
       [3] => 6728 
       [4] => 9024 
       [5] => 11476 
       [6] => 8152 
      ) 
     */ 
    } 
?> 

PHP DEMO

正則表達式屍檢

  • ^ - 字符串匹配必須從這裏開始(因爲我們使用的/m改性劑,然後這意味着每一行必須以wha開頭噸來自該字符之後)
  • [^\s]+ - 任何字符不是空格/標籤/換行符重複1次或多次
  • \s+ - 任何字符,該字符的空間/標籤/換行符重複1或多次
  • ([0-9]+) - 0數字匹配9捕獲組重複1次或多次
  • /m - OU [R修飾符 - 這意味着^將每行的開始,而不是整個文本匹配
+0

感謝您的解釋! – MarkL

3

嘗試:[^\d]*(\d+).*\n?

組1可以得到每行每第一位。

+1

這也是一個好主意!你可以刪除第一部分和最後一部分:'(\ d +)。*'(不要忘記最後一行,之後沒有換行符) –

+0

感謝您的提醒,我在'\ \ n',@Casimir et Hippolyte – LiJieJie

+0

正如我在先例評論中所說的那樣,你可以刪除最後一個'\ n',因爲點不符合它,因爲你之前使用了所有格量詞。 –

相關問題