當我必須在規則中定義負號時,我對解析字符串感到非常困惑,它只是一個負號字符,而不是兩個端點之間的字符範圍。指定一個沒有解釋範圍的字符集
例如,當你寫一個規則%的編碼字符的字符串,你通常會寫
*(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]);
這通常意味着「字母,大寫字母,數字,減號,下劃線,點和波浪線」 ,但第三個減號將創建一個介於9和下劃線之間的範圍,所以您必須將減號放在末尾bk::char_("a-zA-Z0-9_.~-")
。
它解決了當前的問題,但是當輸入是動態的時候,像用戶輸入一樣,減號表示減號字符會怎麼做呢?
我該如何防止Spirit對任何可能的字符賦予特殊含義?
EDIT001: 我採取更加具體的例子從@sehe answer
void spirit_direct(std::vector<std::string>& result, const std::string& input, char const* delimiter)
{
result.clear();
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - char_(delimiter))] % char_(delimiter), result))
result.push_back(input);
}
的情況下,要確保負被視爲負,而不是一人會改變的代碼如下(根據下面的提議)。
void spirit_direct(std::vector<std::string>& result, const std::string&
input, char const* delimiter)
{
result.clear();
bsq::symbols<char, bsq::unused_type> sym_;
std::string separators = delimiter;
for(auto ch : separators)
{
sym_.add(std::string(1, ch));
}
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - sym_)] % sym_, result))
result.push_back(input);
}
看起來很優雅。 在使用靜態常量規則的情況下,我想我可以用'\'來轉義字符,方括號表示這些需要轉義的「特殊」字符之一。爲什麼?是什麼意思 []?有沒有額外的字符可以逃脫?
ho-ho,你有很多:)讓我們看看你的答案http://stackoverflow.com/questions/30046512/splitting-string-using-boost-spirit認爲「分隔符」是「,| - 〜 「那麼當平均Joe也意味着4個分隔符,但是'','',' - ','〜'時,它將捕獲4個分隔符(',','|','}','〜')。我無法指定輸入模式太「遙遠」,它應該向後兼容(減去只是表示減去)。至於下一點 - 1)不優雅。 2a)看起來很麻煩,但也許我沒有得到它。 2b)好得多,但又不是優雅的頂峯。 2c)看起來像醫生所訂的 – kreuzerkrieg
@ kreuzerkrieg「它應該向後兼容」 - 請參閱,這是您的規格!關於相關答案...... [簡單排序有什麼問題](http://coliru.stacked-crooked.com/a/2b21fd6d120e393c)? – sehe
多數民衆贊成它,它不是我的規格...長故事...訂購的東西 - 好的,它是好的和醜陋的:)恕我直言,符號<>的東西更易於理解 – kreuzerkrieg