You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spirit X3中x3::raw的作用及解析结果含尾随空格的疑问

Spirit X3中x3::raw返回包含尾随空格的原因

这问题的核心在于x3::raw的工作机制,以及phrase_parse中skipper的作用方式:

  • 当使用phrase_parse并指定x3::ascii::space作为skipper时,Spirit会在每个原子规则(比如x3::alpha、x3::alnum)匹配前自动跳过空白字符。
  • 普通的rule匹配时,只会把实际命中的alpha/alnum/_字符拼接成结果字符串,那些被skipper跳过的空白不会被加入结果,所以得到Jame007。
  • 而x3::raw的作用是记录规则执行前的输入位置,执行完内部规则后,返回从记录位置到当前输入位置的全部原始字符——包括规则执行过程中被skipper跳过的空白。

具体到你的代码:
执行raw[rule]时,rule里的*(alnum|_)会循环尝试匹配:

  1. 先匹配完Jame007,此时输入迭代器指向第一个空格;
  2. 接下来的循环中,skipper自动跳过所有尾随空格,输入迭代器直接跳到字符串末尾;
  3. 因为没有更多字符可以匹配,rule执行完毕,raw捕获的就是从开头到末尾的整个输入,也就是Jame007 。

如果想让raw只捕获规则实际匹配的非空白内容,可以用x3::lexeme包裹内部规则,禁止skipper在规则内部生效:

const auto rule_raw = x3::raw[ x3::lexeme[rule] ];

这样rule匹配到Jame007后就会停止,raw的结果就和普通rule一致了。

内容的提问来源于stack exchange,提问作者august_71

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:21:27