::boost::spirit:+alnum_p和连字符
::boost::spirit: +alnum_p and hyphen
现在我有了这个提升::精神模式:
str_p("url(") >> !( str_p("'") | str_p(""") ) >> ("#") >>
((+alnum_p)[assign_a(o_rPaintUri)] >>
!( str_p("'") | str_p(""") ) >> str_p(")")
这可以很好地解析像url(#myRadialGradient)
这样的东西,但是如果有像url(#my-RadialGradient4)
这样的连字符,它就不起作用了。我试过(+alnum_p | '-')[assign_a(o_rPaintUri)]
之类的东西,但它不起作用。
有人知道怎么做吗?
感谢
这是精神经典(又名v1.x)。
PS没有线索,但你可以尝试(+(alnum_p | ch_p('-')))
而不是(+alnum_p | '-')
你应该进入本世纪,使用Spirit V2(大约十年前它取代了v1):
Spirit V2
在Coliru上直播
#include <boost/spirit/include/qi.hpp>
int main() {
for (std::string const sample : {
"url(#myRadialGradient)",
"url(#my-RadialGradient4)",
"url('#my-RadialGradient4')",
"url("#my-RadialGradient4")",
})
{
std::cout << " -- parsing '" << sample << "'n";
std::string o_rPaintUri;
bool ok;
{
using namespace boost::spirit::qi;
ok = parse(sample.begin(), sample.end(),
"url(" >> -char_("'"") >> "#" >> +(alnum|char_('-')) >> -char_("'"") >> ")",
o_rPaintUri);
}
if (ok)
std::cout << "Parsed: '" << o_rPaintUri << "'n";
else
std::cout << "Parse failedn";
}
}
打印
-- parsing 'url(#myRadialGradient)'
Parsed: 'myRadialGradient'
-- parsing 'url(#my-RadialGradient4)'
Parsed: 'my-RadialGradient4'
-- parsing 'url('#my-RadialGradient4')'
Parsed: ''my-RadialGradient4''
-- parsing 'url("#my-RadialGradient4")'
Parsed: '"my-RadialGradient4"'
Spirit X3
相同,但将qi
替换为x3
。我建议进行一些改进:
- 现在支持引号中的任何字符(除了引号字符)
- 现在期望所有语法元素并报告有用的错误
在Coliru上直播
#include <boost/spirit/home/x3.hpp>
#include <boost/exception/all.hpp>
#include <iostream>
namespace x3 = boost::spirit::x3;
int main() {
for (std::string const sample : {
"url(#myRadialGradient)",
"url(#my-RadialGradient4)",
"url('#my-RadialGradient4')",
"url("#my-RadialGradient4")",
// extra
"url('#my-RadialGradient4")",
"url('#my-Radial_Gradient4')",
"url('#my-Radial_Gradient4'",
"url(oops)",
"url('oops')",
"url("oops")",
"oops",
})
{
std::cout << " -- parsing " << sample << "n";
std::string o_rPaintUri;
bool ok = false;
try {
using namespace x3;
auto q = [](auto quote) { return quote > as_parser('#') > *(char_ - quote) > quote; };
auto u = rule<struct url, std::string> { "#anchor|'#anchor'|"#anchor"" } // FOR ERROR INFO ONLY
= q("'") | q('"') | '#' >> *~char_(')');
ok = parse(sample.begin(), sample.end(), eps > "url(" > u > ")", o_rPaintUri);
if (ok)
std::cout << "Parsed: '" << o_rPaintUri << "'n";
else
std::cout << "Parse failedn";
} catch (x3::expectation_failure<std::string::const_iterator> const& e) {
std::cout << " Error: '" << std::string(e.where(), sample.end()) << "', expecting " << e.which() << "n";
}
}
}
打印
-- parsing url(#myRadialGradient)
Parsed: 'myRadialGradient'
-- parsing url(#my-RadialGradient4)
Parsed: 'my-RadialGradient4'
-- parsing url('#my-RadialGradient4')
Parsed: 'my-RadialGradient4'
-- parsing url("#my-RadialGradient4")
Parsed: 'my-RadialGradient4'
-- parsing url('#my-RadialGradient4")
Error: '', expecting "'"
-- parsing url('#my-Radial_Gradient4')
Parsed: 'my-Radial_Gradient4'
-- parsing url('#my-Radial_Gradient4'
Error: '', expecting ')'
-- parsing url(oops)
Error: 'oops)', expecting #anchor|'#anchor'|"#anchor"
-- parsing url('oops')
Error: 'oops')', expecting '#'
-- parsing url("oops")
Error: 'oops")', expecting '#'
-- parsing oops
Error: 'oops', expecting "url("
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 字符串重复替换为连字符 C++
- 如何使用 STL C++读取文件和保存连字符
- Flex 词法分析器规则,对包含连字符和斜杠的字母数字字符串具有积极的前瞻断言
- 为什么我不能将 2 个常量字符* 连接到 std::string?
- 如何将其他字符连接到C 中的字符串
- 用连字符替换字符串中的文本
- 为什么我的程序在从字符串中读取连字符时会崩溃
- 尝试将字符连接到 char* 时引发异常
- 匹配里面没有连字符的单词
- ::boost::spirit:+alnum_p和连字符
- 将连字符作为元素包含在scanf()的扫描集中,如果它是列表中的第一个字符或最后一个字符
- 在Linux下使用连字符或下划线作为文件的分隔符
- 如何在Qt正则表达式中匹配连字符