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

如何用Boost Spirit解析字符串中的孤立单词?

使用Boost.Spirit匹配孤立单词的实现方案

要实现大小写不敏感匹配孤立单词(即目标单词不与其他字母连在一起),可以通过Boost.Spirit的规则组合完成,核心是确保目标单词的前后位置不是字母(或处于字符串首尾)。

核心实现代码

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
#include <vector>

namespace qi = boost::spirit::qi;

int main() {
    // 定义大小写不敏感的目标单词"ma"
    const auto target_word = qi::no_case["ma"];

    // 定义孤立单词匹配规则:前后非字母(或处于字符串边界)
    const auto isolated_match =
        qi::omit[!qi::alpha] >>    // 前置检查:非字母或字符串开头
        qi::lexeme[target_word] >> // 匹配目标单词,lexeme确保不跳过内部字符
        qi::omit[!qi::alpha];      // 后置检查:非字母或字符串结尾

    // 测试示例用例
    const std::vector<std::string> test_cases = {
        "mare", "altamarea", "Roma", "no ma va bene", "Ma anche no!"
    };

    for (const auto& input : test_cases) {
        bool is_matched = qi::phrase_parse(
            input.begin(), input.end(),
            // 匹配逻辑:跳过无关内容,找到孤立单词后处理剩余内容
            *qi::omit[qi::char_ - isolated_match] >> isolated_match >> *qi::char_,
            qi::space
        );
        std::cout << "\"" << input << "\" → " << (is_matched ? "匹配!" : "不匹配") << "\n";
    }

    return 0;
}

代码说明

  • qi::no_case["ma"]:实现大小写不敏感匹配,支持"ma"、"Ma"、"MA"等所有大小写组合。
  • qi::omit[!qi::alpha]:通过!qi::alpha检查当前位置不是字母,omit忽略该检查的输出结果,仅做位置有效性验证,确保目标单词不会和其他字母拼接。
  • qi::lexeme:禁用默认的空白跳过规则,保证目标单词的匹配是连续的,不会被空白分割。
  • phrase_parse:结合空白跳过解析整个输入字符串,通过*qi::omit[qi::char_ - isolated_match]跳过所有不满足孤立条件的内容,直到找到目标匹配。

扩展说明

如果需要匹配整个字符串就是孤立单词(比如输入为"ma"或"Ma"),可以简化规则为:

const auto exact_isolated = qi::no_case["ma"] >> qi::eoi;
// 解析时直接用qi::parse(input.begin(), input.end(), exact_isolated)

内容的提问来源于stack exchange,提问作者Claudio La Rosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:40:11