【问题标题】:how to match word in single line using Boost Regex?如何使用Boost Regex匹配单行中的单词?
【发布时间】:2013-10-15 11:57:25
【问题描述】:

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

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

我从模式开始:"^(.*?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 的建议更新源代码。

非常感谢

【问题讨论】:

  • 你说:我有四个单词,在一行中,用 /n 分隔。例如:"aa\nboob\ncoo\nood\nff"。字符串中没有/n,它包含4.5行。
  • 错字,对不起!感谢您指出。

标签: c++ regex boost


【解决方案1】:

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

【讨论】:

  • 谢谢。 "aa\nboob\ncoo\nood\nff" 是一个例子,在现实生活中,我不知道那里有什么。但我知道它是 NOT "\n".
【解决方案2】:

我的这种模式对我来说很好用:

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

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

谢谢。

【讨论】:

    【解决方案3】:

    \b\w*oo\w*\b 应该会有所帮助。 Perl Regular Expression Syntax.

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

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

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

    编译、运行并得到:

    boob
    coo
    ood
    total find: 3
    

    【讨论】:

    • 结果与您的预期有何不同?也许你的问题没有你希望的那么清楚,我误解了你的问题。
    • 实际上,它什么也没给我。我已经列出了来源。您可能需要添加依赖项来提升正则表达式头来编译它。
    • 也许您忘记了需要将正则表达式的反斜杠加倍才能在通过 C++ 字符串文字的漏斗中幸存下来?
    • 非常感谢您的宝贵时间!我不得不说我的问题并不准确。事实上,@paul-evans 建议只匹配单词“[a-z]”而不是任何“.”。我回复了他,但忘记更新问题了。对不起,我不能接受你的答案。我已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多