用boost tokenizer分割字串

2021-07-07 09:47:31 字數 4954 閱讀 6415

說明:本文是boost::tokenizer類的整理,原文出處為boost的document,此處僅作學習筆記之用。

1、boost::tokenizer

boost::tokenizer提供了一種靈活、易用的方式來將乙個字串分解為乙個字串列表。這是個模板類,類的宣告為:

template <

class tokenizerfunc = char_delimiters_separator,

class iterator = std::string::const_iterator,

class type = std::string

>

class tokenizer

它的核心包括,

boost::tokenizer的建構函式有以下兩個:

tokenizer(iterator first, iterator last,const tokenizerfunc& f = tokenizerfunc()) 

templatetokenizer(const container& c,const tokenizerfunc& f = tokenizerfunc())

其中引數的意義如下:
引數描述c

乙個包含被分解的序列的容器。注:c.begin()

和 c.end() 必須可以轉換為模板引數 iterator.

f乙個符合

tokenizerfunction 的函式物件,用於對序列進行分解。

first

迭代器,表示被分解序列的開始位置。

last

迭代器,表示被分解序列的末尾位置。

tokenizer的使用很簡單,以下示例為使用預設引數進行分割字串,

#include#include#includeint main()

}

tokenizer中使用的tokenfunc在boost標準中有其他3個實現,它們分別有不同的分割規則: 

2、boost::char_seperator

char_separator類基於字元分隔符來分解乙個字串行,就象strtok()所做的那樣(但沒有不可重入以及輸入序列析構的問題)。

char_separator類與token_iteratortokenizer一起使用以執行單詞分解。

strtok()函式在單詞輸出序列中不包含用於匹配的字元分隔符。但是,在輸出序列中顯示這些分隔符有時候是有用的,所以char_separator將這個功能作為乙個選項提供。我們將在輸出單詞中包含分隔符稱為 保留分隔符

,而將在輸出單詞中不包含分隔符稱為 被棄分隔符

。當在輸入序列中出現兩個連續的分隔符時,有乙個問題就是是否要輸出乙個 空白單詞

或是直接跳過。strtok()的行為是跳過。而char_separator類則提供了兩個選項。

第乙個例子示範如何將char_separator作為strtok()函式的替代物來使用。我們指定了三個字元分隔符,它們不出現在輸出單詞中。我們沒有指定任何保留分隔符,而且預設情況是忽略空白單詞。

// char_sep_example_1.cpp

#include #include #include int main()

輸出結果是:

下乙個例子示範了用兩個被棄分隔符 '-' 和 ';' 以及乙個保留分隔符 '|' 來進行單詞分解。我們還指定了當出現兩個連續的分隔符時,要在輸出中包含空白單詞。

// char_sep_example_2.cpp

#include #include #include int main()

輸出結果是:
<> <> <|> <|> <> <|> <> <> <|> <>

最後乙個例子示範了使用char_separator的預設建構函式,按標點和空格來進行單詞分解。

// char_sep_example_3.cpp

#include #include #include int main()

輸出結果是:
<,> 

引數

描述預設值

char單詞中的元素型別,通常為char.

traits字元型別的char_traits.

char_traits

3、escaped_list_seperator

escaped_list_separator類是 tokenizerfunction 的乙個實現。escaped_list_separator 對乙個 csv (逗號分隔) 格式進行分解。以下是該模式的一些例子。它使用預設的分隔符、引號和轉義符。

field 1,field 2,field 3

field 1,"field 2, with comma",field 3

field 1,field 2 with \"embedded quote\",field 3

field 1, field 2 with \n new line,field 3

field 1, field 2 with embedded \\ ,field 3

字段通常以逗號分隔。如果你想把逗號放入欄位中,你就要用引號把它括起來。另外還支援以下三個轉義序列

轉義序列 結果

nnewline

其中 是指定為引號的任意字元,而 則是指定為轉義字元的任意字元。

// ******_example_2.cpp

#include#include#includeint main()

}

escaped_list_separator 有兩個建構函式。分別如下:

explicit escaped_list_separator(char e = '\\', char c = ',',char q = '\"')

引數 描述

ec指定用作字段分隔的字元

q指定用作引號的字元

escaped_list_separator(string_type e, string_type c, string_type q):

引數 描述

e字串 e 中的字元都被視為轉義字元。如果給定的是空字串,則沒有轉義字元。

c字串 c 中的字元都被視為分隔符。如果給定的是空字串,則沒有分隔符。

q字串 q 中的字元都被視為引號字元。如果給定的是空字串,則沒有引號字元。

使用這個類時,將它的某個物件傳給 tokenizer 包中需要 tokenizerfunction 的地方。

引數描述

char單詞中的元素型別,通常為char.

traits

字元型別的 traits 類,用於比較字元。預設為 std::char_traits

4、offset_seperator

// ******_example_3.cpp

#include#include#includeint main();

offset_separator f(offsets, offsets+3);

tokenizertok(s,f);

for(tokenizer::iterator beg=tok.begin(); beg!=tok.end();++beg)

}

offset_separator 有乙個有用的建構函式(預設建構函式只是為了讓某些編譯器高興)。宣告如下:

template

offset_separator(iter begin,iter end,bool bwrapoffsets = true, bool breturnpartiallast = true)

引數 描述

begin, end

指定整數偏移量序列

bwrapoffsets

指明當所有偏移量用完後是否迴繞到偏移量序列的開頭繼續。例如字串 "1225200101012002" 用偏移量 (2,2,4) 分解,如果 bwrapoffsets 為 true, 則分解為 12 25 2001 01 01 2002. 如果 bwrapoffsets 為 false, 則分解為 12 25 2001,然後就由於偏移量用完而結束。

breturnpartiallast

指明當被分解序列在生成當前偏移量所需的字元數之前結束,是否建立乙個單詞,或是忽略它。例如字串 "122501" 用偏移量 (2,2,4) 分解,如果 breturnpartiallast 為 true,則分解為 12 25 01. 如果為 false, 則分解為 12 25,然後就由於序列中只剩下2個字元不足4個而結束。

使用這個類時,將它的某個物件傳入到任何需要 tokenizerfunction 的地方。如果該物件是預設構造的,則被分解序列中的每個字元將被作為乙個單詞返回(即預設值為偏移量 1, 且 bwrapoffsets 為 true)。

boost tokenizer 字串按格式分解

tokenizer 庫提供預定義好的四個分詞物件,其中char delimiters separator已棄用.其他如下 char separator有兩個建構函式 1.char separator 使用函式 std isspace 來識別被棄分隔符,同時使用 std ispunct 來識別保留分隔...

用Margin還是用Padding

用margin還是用padding 何時應當使用margin 需要在border外側新增空白時。空白處不需要背景 色 時。上下相連的兩個盒子之間的空白,需要相互抵消時。如15px 20px的margin,將得到20px的空白。何時應當時用padding 需要在border內測新增空白時。空白處需要背...

用Margin還是用Padding

用margin還是用padding這個問題是每個學習css高階時的必經之路。css邊距屬性定義元素周圍的空間。通過使用單獨的屬性,可以對上 右 下 左的外邊距進行設定。也可以使用簡寫的外邊距屬性同時改變所有的外邊距。w3school 邊界 margin 元素周圍生成額外的空白區。空白區 通常是指其他...