2012-01-10 12 views
-1

文字列から文字列を抽出する最も効果的な方法は何ですか?私は何千回もプリフォームを作るためにこの作業が必要です。文字列から部分文字列を抽出する最善の方法と最速の方法は何ですか?

私はこの文字列を持っており、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

イテレータのペアの場合は、それは他の範囲のサブレンジを表す完全に尊敬できる方法です。この場合、目的の部分文字列は接尾辞です。したがって、文字列を含む文字列全体が終端されないようにするために特別な作業をする必要はありません。しかし一般的に、イテレータのペアを使用するということは、それが最後のどこにあるかを示す最後のイテレータであることを意味します。これは、接尾辞ではない部分文字列に対しても機能することを意味します。 –

0

を使用できstd::string::find()

その場合のchar *ちょうど右後の位置へのポインタを動かすよりも、 "URL ="

yourstring = (yourstring + yourstring.find("url=")+4); 
私は速く何も考えカント

..

0

また、ブーストライブラリを調べることもできます。 たとえばboost::split()

実際にスピードの点でどのように機能するのかわかりませんが、試してみる価値はあります。

+1

boost :: splitは汎用関数です。それはしばしば遅いです。 – BruceAdi

関連する問題