2017-11-24 15 views
1

SAS에서 일하고 있는데이 문자열로 올바르게 작동하는 perl reg ex를 찾으려고 노력했습니다. (여기서 src는 문자열이고 txt는 I 행입니다. 싶습니다 ... 출력 라인의 수) 아래Perl Reg Ex Expression - 패턴과 텍스트를 추출한 후

src='01/04/2017 03:45:32 Some Comment - abc 05/04/2017 16:32:41 Some other Comment 06/07 at something' 
txt='01/04/2017 03:45:32 Some Comment - abc' 
txt='05/04/2017 16:32:41 Some other Comment 06/07 at something' 

나는 시도하고이 시도 사용 된 SAS 코드가 ... 여기

data _null_; 
    ExpressionID = PRXPARSE('/(\d{2}\/\d{2}\/\d{4}) (\s) (\d{2}\:\d{2}\:\d{2}) /xio'); 
    text = '01/04/2017 03:45:32 Some Comment - abc 05/04/2017 16:32:41 Some other Comment 06/07 at something'; 

    start = 1; 
    stop = length(text); 

    /* Use PRXNEXT to find the first instance of the pattern, */ 
    /* then use DO WHILE to find all further instances.  */ 
    /* PRXNEXT changes the start parameter so that searching */ 
    /* begins again after the last match.      */ 

    call prxnext(ExpressionID, start, stop, text, position, length);  
    do while (position > 0); 
     found = substr(text, position, length); 
     put found= position= length=; 
     call prxnext(ExpressionID, start, stop, text, position, length); 
    end; 
run; 
+2

이것은 'perl' 질문입니다. 나는 이것이 '마술 정규식'에 대한 직업이 아니라 오히려 당신이'분할 '과 동등한 것을보고 있다고 제안 할 것이다. – Sobrique

+1

[?. +? (? = d | 2} \ /) {2} \ d {4} \ s * \ d {2} (? :: \ d {2}) {2 })'] (https://regex101.com/r/Ts05tl/1)? – Gurman

+0

그것은 정규식입니다, 기본적으로 문자열의 시작/끝을 식별하는 정규식이 필요합니다. – TechGuy

답변

2

가있을 수 있습니다 것은 변화입니다 '랜드 마크'만을 찾는 훨씬 단순한 패턴에 중점을 둡니다. mm/dd/yyyy 텍스트 안에. prxnext 루프는 이전의 랜드 마크를 추적하고 그것에 기초하여 found을 추출합니다.

data extracts(keep=line found); 
    if _n_ = 1 then do; 
    rxid = PRXPARSE('/\d{2}\/\d{2}\/\d{4} /'); * nominally mm/dd/yyyy followed by at least one space; 
    retain rxid; 
    end; 

    line = _n_; 

    infile cards _infile_=text; 
    input; 

    start = 1; 
    stop = length(text); 
    position = 0; 
    length = 0; 

    /* Use PRXNEXT to find the first instance of the pattern, */ 
    /* then use DO WHILE to find all further instances.  */ 
    /* PRXNEXT changes the start parameter so that searching */ 
    /* begins again after the last match.      */ 

    call prxnext(rxid, start, stop, text, position, length); 

    lastpos = 0; 
    do while (position > 0); 
    if lastpos then do; 
     length found $200; 
     found = substr(text,lastpos,position-lastpos); 
     put found=; 
     output; 
    end; 
    lastpos = position; 

    call prxnext(rxid, start, stop, text, position, length); 
    end; 

    if lastpos then do; 
    found = substr(text,lastpos); 
    put found=; 
    output; 
    end; 

datalines4; 
01/04/2017 03:45:32 Some Comment - abc 05/04/2017 16:32:41 Some other Comment 06/07 at something 
Some fakery 01/04 /2017 03:45:32 /11/11/1967. yo 01/02/1102 Some Comment - abc 05/04/2017 16:32:41 Some other Comment 06/07 at something 

aabbccdd 
01/02/1903 abc def 
01/02/1903 abc def sas does have trouble matching a patterns having a trailing space 02/03/1904 
;;;; 
run; 

장황한 SAS 코드를 처리 할 때 더 간단한 패턴이 유용합니다.

+0

안녕, 고마워. :) – TechGuy