當submatch的索引指定爲-1時,sregex_token_iterator幾乎可以完美地作爲標記器工作。regex as tokenizer - 以分隔符開頭的字符串
#include <string>
#include <regex>
#include <iostream>
using namespace std;
int main()
{
string s("--aa---b-c--d--");
regex r("-+");
for (sregex_token_iterator it = sregex_token_iterator(s.begin(), s.end(), r, -1); it != sregex_token_iterator(); ++it)
{
cout << (string) *it << endl;
}
return 0;
}
打印出:
不過遺憾的是它並不能很好地與帶分隔符e.g開頭的字符串工作
aa
b
c
d
(注意前導空行)。
所以請注意,它實際上處理尾隨的定界符(因爲它不打印額外的空行)。
讀好像有標準是一個條款用於特異性處理後定界符很好地工作,即:
[re.tokiter] no 4.
如果到達序列的末尾(位置等於的端部序列迭代器)時,迭代器變得等於序列結束迭代器值,除非被枚舉的子表達式具有索引-1,在這種情況下,迭代器枚舉最後一個子表達式,該子表達式包含從結尾的所有字符最後的正則表達式與枚舉的輸入序列的末尾匹配,只要這個 不會是一個空的子表達式。
有誰知道這個看似不對稱行爲被指定的原因是什麼?
最後,有沒有一個優雅的解決方案,使這項工作? (這樣我們根本沒有空的條目)。
我有點好奇,爲什麼你想標記生成器扔掉分隔符 - 這可能是在你的語言錯誤用分隔符開始輸入,如果標記器將其拋棄,則無法確定您的代碼將無法解析輸入。你能在語法層面上處理這個問題嗎? – sarnold 2012-03-21 01:11:01
不,我現在沒有真正處理特定的問題,只是想知道這是否可行。 – ryaner 2012-03-21 01:18:56
更優雅的解決方案:使用真正的標記器,如[Boost.Tokenizer](http://www.boost.org/doc/libs/1_49_0/libs/tokenizer/index.html)。 :P – Xeo 2012-03-21 01:23:30