2012-05-03 29 views
10

Vì tôi không thể tìm thấy bất cứ điều gì về điều này trong số documentation, tôi nghĩ rằng tôi yêu cầu nó ở đây. Tôi có chương trình sau đây (C++ 11):boost :: split lá trống thẻ ở đầu và cuối chuỗi - là hành vi mong muốn này?

#include <iostream> 
#include <boost/algorithm/string.hpp> 

using namespace std; 
using namespace boost; 

int main() { 
    string tmp = " #tag #tag1#tag2 #tag3 ####tag4 "; 
    list<iterator_range<string::iterator> > matches; 
    split(matches, tmp, is_any_of("\t #"), token_compress_on); 

    for(auto match: matches) { 
      cout << "'" << match << "'\n"; 
    } 
} 

Đầu ra là:

'' 
'tag' 
'tag1' 
'tag2' 
'tag3' 
'tag4' 
'' 

Tôi đã có thể nghĩ rằng tùy chọn token_compress_on loại bỏ tất cả các thẻ trống. Giải pháp là, ví dụ: sử dụng boost::trim_if. Tuy nhiên tôi đã tự hỏi nếu đây là hành vi mong muốn của tăng :: tách, và tại sao điều này đang xảy ra?

(g ++ 4.6.3, tăng 1,48)

Trả lời

8

Hành vi này là có chủ ý, bởi vì bạn có thể tái tạo chuỗi (hoàn chỉnh với khởi đầu và không gian trailing) từ phiên bản phân chia. Boost không biết liệu khoảng trắng đó có quan trọng hay không đối với bạn (có thể là do một số định dạng tệp có thể buộc không gian hàng đầu/số lượng không gian cụ thể).

Bạn nên trim_if hoặc trim như bạn đang thực hiện nếu bạn cần xóa không gian đầu/cuối.

+0

Có lẽ tôi không nắm được vấn đề, nhưng làm thế nào tôi có thể tái tạo "#tag # TAG1 # TAG2 # TAG3 #### tag4" từ thẻ " "," thẻ "," tag1 "," tag2 "," tag3 "," tag4 "," "? – fdlm

+0

@fdlm Điều đó sẽ cụ thể đối với định dạng chuỗi của bạn. Các hành vi của 'tăng :: chia' là khá chung chung, nhưng đối với một số người dùng, họ có thể quan tâm đến việc bảo tồn dấu vết/nhân vật hàng đầu mà nếu không sẽ được loại bỏ bằng cách chia tách trên chúng. Về cơ bản nếu bạn cần những ký tự đó biến mất, bạn cần phải rõ ràng và soạn các hàm với nhau để làm những gì bạn mong đợi. – birryree

+0

Ok, tôi hiểu rồi. Cám ơn bạn vì đã chỉ ra điều này. – fdlm

7

Nếu đối số eCompress được đặt thành token_compress_on, các dấu phân cách liền kề sẽ được hợp nhất với nhau. Nếu không, mỗi hai dấu tách sẽ phân tách một mã thông báo.

Here

Nó không loại bỏ mã thông báo chỉ hợp nhất chúng.

0

boost::split luôn trả về n + 1 mã thông báo trong đó n là số dấu phân cách trong chuỗi đầu vào. Vì vậy, đừng ngạc nhiên khi nó trả về 1 mã thông báo khi bạn vượt qua nó một chuỗi rỗng.

Lý do đằng sau nó khá đơn giản. Hãy tưởng tượng rằng bạn đang phân tích cú pháp tệp CSV. Bạn cần nhận được chính xác số lượng phần tử bất kể mã thông báo cuối cùng có trống hay không.

Việc xóa các mã thông báo trống dễ dàng hơn nhiều so với đoán xem chúng có được cho là kết quả hay không. Credit

Hành vi này cũng tương tự như python

>>> len("".split(',')) 
1 
Các vấn đề liên quan