-1

我有四个单词,在一行中,用 . 分隔\n。例如:("aa\ne'sboob\ng-coo\nood\nff" 注意,单词可能不仅包含英文字母,而且不包含'\n'!)

我想在单词级别进行部分匹配:例如部分匹配"oo"给了我"boob", "coo", and "ood"

我从 pattern: 开始"^(.*?oo.*?)$",它给了我: "aa\ne'sboob", "g-coo", and "ood"。显然"aa\ne'sboob"是错误的。

我正在使用 Boost 正则表达式:

#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main()
{    
    std::vector<std::string> v; 
    std::string text = "aa\ne'sboob\ng-coo\nood\nff";

    const char* pattern = "^(.*?oo.*?)$";
    boost::regex reg(pattern);
        boost::sregex_iterator it(text.begin(), text.end(), reg);
        boost::sregex_iterator end;
    std::string tmp;
        for (; it != end; ++it) {
        tmp = it->str();
        v.push_back(it->str());
            std::cout << tmp << std::endl;
        }
    std::cout << "total find: " << v.size() << std::endl;
    return 0;
}

可以请帮助我吗?

编辑:我有一个模式工作,但我不明白。还请帮忙解释。注意:也许我在正确使用 Boost 正则表达式方面需要帮助。

编辑:澄清单词可能不仅包含英文字母。还按照@just-somebody 的建议更新源。

非常感谢

4

3 回答 3

0

.*当你想要的时候不要在你的正则表达式中使用[a-z]*

于 2013-10-15T11:59:53.317 回答
0

\b\w*oo\w*\b应该有帮助。 Perl 正则表达式语法

编辑因为OP争辩答案...

我对发布的代码进行了这些更改:

  • 添加#include <boost/regex.hpp>
  • 将功能更改为int main(void)
  • 将模式更改为const char* pattern = "\\b\\w*oo\\w*\\b";

编译、运行并得到:

boob
coo
ood
total find: 3
于 2013-10-15T13:19:14.260 回答
0

我有这种模式对我来说很好:

"^([^\\n.]*?oo.*?)$"

但我期待更优雅的解决方案。

谢谢你。

于 2013-10-15T12:15:27.663 回答