2008-09-21 2 views
1

unrar 명령을 호출 할 파일을 보려면 파일 세트의 첫 번째 파일을 판별해야합니다. 자연 - - 여기 RAR 파일 세트의 첫 번째 파일에만 일치하는 정규 표현식

이있는 일부 샘플 파일 이름 만 첫 번째 그룹이 일치해야합니다

yes.rar 
yes.part1.rar 
yes.part01.rar 
yes.part001.rar 

no.part2.rar 
no.part02.rar 
no.part002.rar 
no.part011.rar 
하나는 PCRE 호환 regexps '에 함께 할 수있는 (제한)의 방법입니다

이 :

.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar) 

그러나 이것을 Rejax에서 테스트했을 때 Ruby에서 작동하지 않았습니다.

어떻게 작성 하시겠습니까? Ruby 호환 정규 표현식을 사용하여 RAR 파일 집합의 첫 번째 파일 만 일치 시키시겠습니까?

+0

다음 rar 파일에 확장자 r01, r02, r03 등이 있다고 생각했습니다. – paxdiablo

+0

예,이 문제점의 근본 원인 인 두 가지 명명 스키마가 있습니다. 당신은 .rar, .r01 등 또는 part01.rar, part02.rar 등이 있습니다. – Micke

+0

중복 : http://stackoverflow.com/questions/2537882/ –

답변

3

짧은 대답은 문제를 해결하기 위해 하나의 정규식을 구성 할 수 없다는 것입니다. Ruby 1.8에는 lookaround 어설 션이 없습니다 (예 : 정규식에? <!) 정규식이 작동하지 않는 이유는 두 가지 옵션이 있습니다.

1) 두 가지 이상의 정규식을 사용하십시오 .

def is_first_rar(filename) 
    if ((filename =~ /part(\d+)\.rar$/) == nil) 
     return (filename =~ /\.rar$/) != nil 
    else 
     return $1.to_i == 1 
    end 
end 

2) 루비 1.9, Oniguruma의 정규식 엔진을 사용합니다. 둘러보기 어설 션을 지원하며 install it as a gem for ruby 1.8 수 있습니다. 그 후에는 다음과 같이 할 수 있습니다.

def is_first_rar(filename) 
    reg = Oniguruma::ORegexp.new('.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)') 
    match = reg.match(filename) 
    return match != nil 
end 
0

나는 더 정규식 전문가입니다 없지만 여기 내 시도

^(yes|no)\.(rar|part0*1\.rar)$ 

교체 "예 | 아니오"입니다 실제 파일 이름은. 귀하의 예제에 대해 그것을 일치하므로 첫 번째 집합을 따라서 "yes | no"정규식 일치하는 경우에만 일치하는지.

업데이트 : 설명에 따라 수정 됨. 사용자가 파일 이름을 모르는 이유를 모르겠습니다.

+0

이것은 "no.part21.rar"도 허용합니다. "[^ 1]"대신 "0"을 원할 것입니다. 또한 파일 이름이 미리 알려지지 않았는지 의심 스럽습니다. – mweerden

+0

불행히도 사용자가 파일 이름을 알 수있는 방법이 없습니다. 그래도 정규 표현식으로 파일 이름을 더 잡을 수 있습니다. ^ \ D + \ (rar | part0 * 1 \ .rar) $ 하지만 파일 이름에 숫자가 있으면 다시 한 번 사각형으로. – Micke

0

개인적으로이 경우에는 정규 표현식을 사용하지 않습니다 (또는 적어도 하나만 다룰 수는 없습니다) . 이 코드를 코딩 할 때 어떤 문제가 있습니까? 예 : 몇 가지 if?

+0

그 점에 아무런 문제가 없으며 그 질문을하기 전에 바로 그 문제를 해결했습니다. 그러나 일단 당신이 뭔가를 시도하고 그것을 파악할 수 없으면, 어떻게해야 하는지를 정말로 알고 싶습니다. – Micke

4

어느 것이 첫번째인지 판단하기 위해 파일 이름에 의존하지 마십시오. 당신은 당신이 잘못된 파일을 얻는 최후의 사건을 발견하게 될 것입니다.

RAR's headers은 RAR의 다소 최근 버전에서 생성되었다고 가정하고 볼륨의 첫 번째 파일을 알려줍니다.

HEAD_FLAGS 비트 플래그 :
2 바이트

0x0100은 - (이상에서만 RAR 3.0 설정) 먼저 볼륨

그래서 각 파일을 열고 RAR 검토 헤더, 어떤 파일이 첫 번째 볼륨인지 나타내는 플래그를 구체적으로 찾습니다. 아카이브가 손상되지 않는 한이 작업은 실패하지 않습니다.위의 링크에 따라 RAR 아카이브와 헤더에 대한 자체 테스트를 수행했습니다.

이렇게하면 어떤 파일이 첫 번째 집합인지를 훨씬 더 안전하게 확인할 수 있습니다.

관련 문제