提升精神解析字符串以前缀开头
Boost spirit parse string starts with a prefix
>我目前正在尝试解析字符串,从一些前缀+数字开始。 喜欢abc_.+ d+
.但是有一些大问题。 这是一个测试代码
#define BOOST_SPIRIT_DEBUG
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <iomanip>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/phoenix/phoenix.hpp>
namespace qi = boost::spirit::qi;
struct S {
std::string s;
int n = 0;
};
BOOST_FUSION_ADAPT_STRUCT(S, s, n)
struct parser : qi::grammar<std::string::const_iterator, S(), qi::ascii::space_type> {
typedef std::string::const_iterator Iterator;
qi::rule<Iterator, S(), qi::ascii::space_type> start;
qi::rule<Iterator, std::string(), qi::ascii::space_type> abc;
parser() : parser::base_type(start) {
abc = qi::raw[ "abc_" >> +(qi::alnum)];
//abc = qi::raw[ "abc_" >> +(qi::alpha)];
start %= abc >> qi::int_;
BOOST_SPIRIT_DEBUG_NODES( (start)(abc))
}
};
int main() {
using boost::spirit::ascii::space;
parser g;
for(std::string str : {"abc 1", "abc_ 1", "abc_aaa 1", "abc_555 1", "cba_aaa 1"}) {
std::cout << str << " - ";
std::string::const_iterator iter = str.begin();
std::string::const_iterator end = str.end();
S s;
bool r = phrase_parse(iter, end, g, space, s);
if(r)
std::cout << "Ok";
else
std::cout << "fail";
std::cout << std::endl;
}
}
出于某种原因,qi::alnum 也会占用空间:
abc_aaa 1 - <start>
<try>abc_aaa 1</try>
<abc>
<try>abc_aaa 1</try>
<success></success>
<attributes>[[a, b, c, _, a, a, a, , 1]]</attributes>
</abc>
<fail/>
</start>
fail
如果我把它改成qi::alpha
abc_aaa 1 - <start>
<try>abc_aaa 1</try>
<abc>
<try>abc_aaa 1</try>
<success>1</success>
<attributes>[[a, b, c, _, a, a, a, ]]</attributes>
</abc>
<success></success>
<attributes>[[[a, b, c, _, a, a, a, ], 1]]</attributes>
</start>
Ok
工作正常,但不可能像abc_123
那样解析令牌。
有什么建议吗?
谢谢!
在科里鲁身上试试
由于您提供了船长、序列解析器以及加解析器(和其他一些(,因此在原始解析器匹配之间使用它,因此abc
解析器匹配abc_(s*[0-9a-zA-Z])+
。
完全针对您的情况,有一个lexeme
指令,它提供了一种机制来禁用不需要的跳过。像abc = qi::raw[qi::lexeme["abc_" >> +qi::alnum]]
一样使用它会匹配abc_[0-9a-zA-Z]+
,整个语法会匹配abc_[0-9a-zA-Z]+s*d+
。
相关文章:
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?
- 提升精神解析字符串以前缀开头
- C 11正则表达式和字符串U8前缀
- 如何实现将前缀与字符串匹配的最快算法
- 为带有带前缀的字符串的容器查找相等的范围
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 在 Python 中'r'带有字符串的前缀等效C++是多少?
- 创建一个从前缀到C 中字符位置的新字符串
- 字符文字与字符串字面的u前缀有什么区别
- 当带前缀的字符串与无前缀的字符串相邻时,字符串文本串联失败
- 一种在检查十六进制前缀后将字符串转换为int的更干净的方法
- 查找有序STL容器中以前缀开头的所有字符串(非低位ASCII)
- 为包含通用字符名的字符串文字省略u8前缀
- 进行字符串前缀测试的优雅方法
- 如何在boost regex_search中获取原始字符串前缀
- 具有最大长度的字符串前缀同构