2013-10-23 3 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)를 사용하고 계십니까?

감사합니다. 모든 경기 전에

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

\K 재설정 :

답변

2

당신은이 패턴을 사용할 수 있습니다.

+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로 시작해야 함을 의미합니다. t는
  • [^\s]+)이 문자 다음에 오는 - 공백/탭/개행 문자가 반복이 아닌 모든 문자를 1 회 이상
  • \s+ - 공백/탭/개행 1을 반복되거나 모든 문자 90의 번호와 일치하는 포착 기가 반복 1 회 이상
  • /m - -
  • ([0-9]+)OU R 수정 -이 ^ 모든 라인의 시작과 전체가 아닌 텍스트와 일치한다는 것을 의미
+0

설명 주셔서 감사합니다! – MarkL

3

시도 : [^\d]*(\d+).*\n?

그룹 1은 각 행마다 첫 번째 자리를 얻을 수 있습니다.

+1

너무 좋은 생각입니다! 첫 부분과 마지막 부분을 제거 할 수 있습니다 :'(\ d +). *'(마지막 줄에는 줄 바꿈이 없습니다.) –

+0

상기시켜 주셔서 감사합니다.'\ n', @Casimir et Hippolyte – LiJieJie

+0

앞의 주석에서 말했듯이, 이전의 소유권 한정 기호를 사용하기 때문에 점이 일치하지 않기 때문에 마지막 '\ n'을 제거 할 수 있습니다. –

관련 문제