如何用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
相关产品推荐
相关产品推荐

