2012-01-10 2 views
-1

문자열에서 문자열을 추출하는 가장 효과적이고 효과적인 방법은 무엇입니까? 나는 수천 번 preforms이 작업이 필요합니다.문자열에서 하위 문자열을 추출하는 가장 빠르고 가장 빠른 방법은 무엇입니까?

이 문자열이 있는데 URL을 추출하고 싶습니다. URL은 항상 문자열의 끝까지 "url ="하위 문자열 다음에옵니다. 예를 들어 :

http://foo.com/fooimage.php?d=AQA4GxxxpcDPnw&w=130&h=130&url=http00253A00252F00252Fi1.img.com00252Fvi00252FpV4Taseyww00252Fhslt.jpg 

와 나는 내가 분할 등을 사용하지 않도록 할

http00253A00252F00252Fi1.img.com00252Fvi00252FpV4Taseyww00252Fhslt.jpg 

를 추출해야합니다. 당신이 절대적으로 문자열로 결과를해야하는 경우

+0

'split'을 사용하지 않으시겠습니까? 왜? 그리고 무엇을 시도 했습니까? –

+0

'std :: string :: find()'와'std :: string :: substr()'이 이것을하는 가장 간단한 방법 인 것처럼 보입니다. 이것이 가장 빠른 방법인지 나는 모른다. 당신이 다른 추출 방법과 비교 (프로파일)해야한다는 것을 결정하기 위해서. – hmjd

답변

2
std::string inStr; 

//this step is necessary 
size_t pos = inStr.find("url="); 

if(pos != std::string::npos){ 
    char const * url = &inStr[pos + 4]; 
    // it is fine to do any read only operations with url 
    // if you would apply some modifications to url, please make a copy string 
} 
5

, 당신은 를 측정해야하지만, 난 아무것도 가장 직관적보다 훨씬 빠를 것이라고 의심 :

std::string 
getTrailer(std::string const& original, std::string const& key) 
{ 
    std::string::const_iterator pivot 
     = std::search(original.begin(), original.end(), key.begin(), key.end()); 
    return pivot == original.end() 
     ? std::string() // or some error condition... 
     : std::string(pivot + key.size(), original.end()); 
} 

그러나, 가장 빠른 방법입니다 아마도 문자열을 전혀 추출하지 않고 이터 레이 터 쌍으로 유지하는 것일 것입니다. 이것을 많이 필요로한다면 Substring 클래스를 정의하는 것이 가치가 있습니다. ( 파싱 할 때 매우 효과적인이 변종을 발견했습니다.이 방법을 사용하면 원래 문자열이 사라지면 이터레이터는 이 유효하지 않게됩니다. 이 상황이 발생하기 전에 문자열로 유지하고자하는 내용을 으로 변환하십시오.

+0

+1 쌍의 반복자에 대해서는 다른 범위의 하위 범위를 나타내는 완벽하게 훌륭한 방법입니다. 이 경우 원하는 부분 문자열은 접미사이므로, 문자열을 포함하는 전체가 nul로 끝나는 지 확인하기 위해 특별한 작업을 할 필요가 없습니다. 그러나 일반적으로 한쌍의 반복자를 사용한다는 것은 그것이 끝이 어디인지를 알려주는 끝 반복자라는 것을 의미합니다. 즉, 접미어가 아닌 부분 문자열에 사용할 수 있다는 것을 의미합니다. –

0

당신이 사용할 수있는 std::string::find() :

의 경우 숯불 * 바로 뒤에 위치로 포인터를 이동보다 "URL ="

yourstring = (yourstring + yourstring.find("url=")+4); 
내가 빨리 아무것도 생각하지 못할

..

0

부스트 라이브러리를 살펴볼 수도 있습니다. 예를 들어 boost::split()

나는 속도면에서 실제로 어떻게 작동하는지 모르지만, 시도해 볼만한 가치가있다.

+1

boost :: split은 일반적인 함수입니다. 그것은 종종 더 느립니다. – BruceAdi

관련 문제