使用Boost::Spirit解析转义字符串
Parsing escaped strings using Boost::Spirit
我想写一个boost::spirit
解析器,解析一个使用转义双引号的双引号中的简单字符串,例如"a "b" c"
。
这是我尝试的:
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
namespace client
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
template <typename Iterator>
bool parse(Iterator first, Iterator last)
{
using qi::char_;
qi::rule< Iterator, std::string(), ascii::space_type > text;
qi::rule< Iterator, std::string() > content;
qi::rule< Iterator, char() > escChar;
text = '"' >> content >> '"';
content = +(~char_('"') | escChar);
escChar = '' >> char_(""");
bool r = qi::phrase_parse(first, last, text, ascii::space);
if (first != last) // fail if we did not get a full match
return false;
return r;
}
}
int main() {
std::string str = ""a \"b\" c"";
if (client::parse(str.begin(), str.end()))
std::cout << str << " Parses OK: " << std::endl;
else
std::cout << "Failn";
return 0;
}
它遵循boost精神解析转义字符串的示例,但输出是"Fail"。我怎样才能使它工作呢?
我已经有一段时间没有尝试精神了,但我认为你的一个规则是错误的。
试题:
content = +(escChar | ~char_('"'))
代替:
content = +(~char_('"') | escChar)
它使用~char('"')
匹配您的,因此永远不会检查
escChar
是否匹配。然后,它读取下一个"
作为字符串的结尾,并停止解析。
相关文章:
- 如何用转义符替换字符串中的所有特殊字符
- 为什么当我从 cin 阅读时转义字符不起作用?
- 转义std::字符串中的特殊字符
- 哪些字符会自动C++ Windows HttpOpenRequest() 进行 url 转义?
- 在QLineEdit中显示和编辑转义字符
- std::regex_error语言 - 意外的转义字符
- LPCWSTR 查找和替换为转义字符
- 将转义的 UTF-8 八位字节的字符数组转换为 C++ 的字符串
- 修改正则表达式以包含反斜杠和单引号(以便反斜杠表现为转义字符)
- 如何在C++中转义白色字符
- 有人可以解释一下与 Windows 文件系统相关的C++转义字符" "吗?
- 转义 printf() 中的所有特殊字符
- C++正则表达式转义标点字符,如"."
- 将带有转义字符的大字符串转换为字节数组
- 由转义字符组成的字符串文字的大小
- 如何转义整个字符序列?
- C11 和 C++11 扩展和通用字符转义
- 如何将字母字符转换为相应的转义特殊字符
- 用C/ c++转义unicode字符
- 用于regex的转义特殊字符