2011-03-29 5 views
0

파일 이름의 접미사를 제거하는 정규식은 무엇입니까? 예를 들어 "vnb.txt"와 같은 문자열에 파일 이름이 있으면 ".txt"를 제거 할 정규식은 무엇입니까? 감사합니다. .접미사를 제거하는 정규식

+2

왜이 질문에 C++ 또는 qt4 태그가 지정되어 있습니까? –

+0

@ 존 디 블링 : OP가 Qt4 및 C++을 사용하고 있기 때문에 그것이라고 추측 할 수 있습니다. Qt4/C++에 특화된 솔루션이 있다면 일반적인 솔루션에 비해 매우 환영받을 것이라고 생각합니다. – FrustratedWithFormsDesigner

+0

a를 조금 후에 어떻게 알 수 있습니까? 정말 접미사입니까? ".hidenfile"다중 접미사는 어떨까요? "foo.bar.tar.gz"파일 이름을 조작하는 최종 목적은 무엇입니까? –

답변

0

운영 체제가 다르면 파일에 다른 문자가 허용 될 수 있습니다. 가장 간단한 정규 표현식은 (.+)\.txt$ 일 수 있습니다. 파일 이름을 가져 오려면 첫 번째 캡처 그룹을 가져옵니다.

+0

'.txt'뿐만 아니라 모든 파일 이름 확장자와 일치 시키려면'(. +) \. ([^ \.] +)'를 사용하십시오 (일치하지 않으면 파일 이름에 확장자가 없습니다). –

+0

@ Felix Dombek : 당신은 또한'ENV1.20110329.dat'와 같은 파일 이름을 처리 할 수 ​​있어야합니다 ... 당신의 패턴이'ENV1'과'20110329'를 포획 할 것이지만'.dat' 파일 확장자를 얻지는 않을 것이라고 생각합니다. – FrustratedWithFormsDesigner

+1

아니요, 첫 번째 캡처 그룹이 꺼림 ('(\. +?))으로 지정되지 않은 경우 아닙니다. 하지만 확실하게 알고 싶다면'^'와'$'를 사용할 수 있습니다 : 완전한 정규 표현식은'^ (. +) \. ([^ \.] +) $' –

4

정규 표현식이 정말로 필요합니까? 스트링의 마지막 마침표를 찾지 않고 그 시점까지 문자열을 다듬어 보는 것이 어떻습니까? 솔직히, 정규 표현식에는 많은 오버 헤드가 있으며,이 경우에는 필자가 필요하다고 생각하지 않는다.

tstenner에 의해 제안으로, 당신은 당신이 사용하고있는 문자열의 종류에 따라 다음 중 하나를 시도 할 수 있습니다 :

std::strrchr

std::string::find_last_of

첫 번째 예 :

char* str = "Directory/file.txt"; 

size_t index; 
char* pStr = strrchr(str,'.'); 
if(nullptr != pStr) 
{ 
    index = pStr - str; 
} 

두 번째 예 :

int index = string("Directory/file.txt").find_last_of('.'); 
+0

입니다. 경로명은 사실이 아닙니다. – khachik

+2

string :: find_last_of에 대한 참조를 추가 할 수 있습니다. – tstenner

2

접미사를 제외한 모든 것을 제공하는 솔루션을 찾으려면 string::find_last_of을 사용해야합니다.

코드는 다음과 같을 수 있습니다 :


const std::string removesuffix(const std::string& s) { 
    size_t suffixbegin = s.find_last_of('.'); 

    //This will handle cases like "directory.foo/bar" 
    size_t dir = s.find_last_of('/'); 
    if(dir != std::string::npos && dir > suffixbegin) return s; 
    if(suffixbegin == std::string::npos) return s; 
    else return s.substr(0,suffixbegin); 
} 

정규 표현식을 찾는 경우는, \.[^.]+$를 사용합니다.
첫 번째 .을 이스케이프 처리해야합니다. 그렇지 않으면 모든 문자와 일치하며 끝에 $를 추가하므로 문자열 끝에 만 일치합니다.

2

Qt를 이미 사용하고 있다면 QFileInfo을 사용하고 baseName() 함수를 사용하여 이름 (있는 경우) 또는 suffix() 함수 (있는 경우)를 얻을 수 있습니다.

관련 문제