2010-09-17 29 views
7

Làm cách nào để tách chuỗi dựa trên chuỗi con khác theo cách đơn giản?Chia nhỏ trên chuỗi con

ví dụ: chia trên "\ r \ n"

message1\r\nmessage2 

=>

message1 
message2 

Từ những gì tôi đã có thể tìm thấy cả hai tăng :: tokenizer và đẩy mạnh :: chia chỉ hoạt động trên nhân vật duy nhất.

EDIT:

Tôi biết rằng tôi có thể làm điều này bằng cách sử dụng std :: string :: tìm và std :: string :: substr và có một vòng lặp vv ... nhưng thats không phải những gì tôi muốn nói bởi "đơn giản".

Trả lời

16

Mặc dù tăng :: chia thực sự có một vị hoạt động trên các nhân vật, có một sự thúc đẩy string algorithm rằng có thể chia nhỏ vào chuỗi con:

#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 
#include <boost/algorithm/string/iter_find.hpp> 
#include <boost/algorithm/string/finder.hpp> 
int main() 
{ 
    std::string input = "message1foomessage2foomessage3"; 

    std::vector<std::string> v; 
    iter_split(v, input, boost::algorithm::first_finder("foo")); 

    copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " ")); 
    std::cout << '\n'; 
} 
1

Bạn có thể tìm kiếm lần xuất hiện tiếp theo của chuỗi con được sử dụng làm mã thông báo phân tách. Một phương pháp như vậy có thể sẽ trả về chỉ số của lần xuất hiện tiếp theo và có điều này bạn có thể tách chính chuỗi đó.

+1

+1, chắc chắn .. tôi có thể làm một str.find và sau đó substring vv ... nhưng thats không phải những gì tôi định nghĩa như là một cách đơn giản. – ronag

0

Đó là một phụ thuộc rất lớn, nhưng cá nhân tôi thích Boost::Tokenizer.

Từ ví dụ trên trang:

// simple_example_1.cpp 
#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
+1

Điều này chỉ hoạt động đối với các ký tự phân cách đơn (hoặc dấu phân tách là các kết hợp các dấu phân cách đơn, theo thứ tự bất kỳ), OP hỏi về các phân đoạn được sử dụng như các dấu phân cách. – Cubbi

+0

@Cubbi: bạn đã chính xác trên ví dụ đã cho, nhưng bạn có thể cung cấp một mã thông báo tùy chỉnh chia tách trên các chuỗi con. – ybungalobill

-1

Như miễn là nó liên quan đến khoảng trắng:

string s("somethin\nsomethingElse"); 
strinstream ss(s); 
string line; 
vector<string> lines; 
while(ss >> line) 
{ 
    lines.push_back(line); 
} 

Hoặc, sử dụng getline(), cho phép bạn chỉ định các nhân vật tokenizing như một tham số thứ ba tùy chọn:

string s("Something\n\rOr\n\rOther"); 
stringstream ss(s); 
vector<string> lines; 
string line; 
while(getline(ss,line)) 
{ 
    lines.push_back(line); 
} 
Các vấn đề liên quan