确定给定的句子是否包含给定的单词c ++

时间:2014-06-23 10:24:35

标签: c++ regex string substring

我需要确定在c ++中是否在另一个字符串中找到给定的单词。

我的函数原型就像bool check(string sentence, string word);

和“句子”可能像:word.someWord AND/OR/XOR word2.someWord *AND/OR/XOR* word3.someWord并且就是这样。

一个真实的例子: unlock_the_door.value = 1 AND turn_of_car.checkSum = 1

现在,在这个例子中如果我将word分配给lock,我的check函数应该返回false但是如果我将它赋予“unlock”它应该返回true。

要做到这一点,我已经习惯了.find()函数,但是你们都知道这是错误的,因为即使我把锁作为一个单词参数,它也会让我返回true,因为“unlock”包含“lock”

我想我需要使用正则表达式,但我不知道该怎么做。有人帮我吗?提前致谢。

5 个答案:

答案 0 :(得分:1)

首先将您的句子分成单词,然后检查列表以查看它是否包含您要查找的确切单词。

您还可以考虑使用正则表达式并查找每个单词前面的任何行开头或空格,后跟任何空格,标点符号或行尾。

答案 1 :(得分:1)

我的意思是下划线是空白的。

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>


bool check( const std::string &sentence, const std::string &word )
{
   std::istringstream is( sentence );

   return std::find( std::istream_iterator<std::string>( is ),
                     std::istream_iterator<std::string>(),
                     word ) != std::istream_iterator<std::string>();
}

int main()
{
    std::cout << std::boolalpha
              << check( "unlock the door.value=1 AND turn of car.checkSum=1", "lock" )
              << std::endl;

    std::cout << std::boolalpha
              << check( "unlock the door.value=1 AND turn of car.checkSum=1", "unlock" )
              << std::endl;

    return 0;
}

输出

false
true

如果下划线不是空白,那么您可以使用相同的std::istringstream和标准函数std::getline并检查每个读取字符串是否等于给定的字符串。

或者您确实可以使用成员函数std::vector<std::string>

将句子拆分为find_first_of类型的对象

例如

#include <iostream>
#include <iomanip>
#include <string>


bool check( const std::string &sentence, const std::string &word )
{
    const char *delimiters = " _=.";
    std::string::size_type first, last;
    bool found = false;

    first = 0;
    while ( !found && first != std::string::npos )
    {
        first = sentence.find_first_not_of( delimiters, first );

        if ( first != std::string::npos )
        {
            last = sentence.find_first_of( delimiters, first );
            found = sentence.substr( first, last == std::string::npos ? last : last - first ) == word;
            first = last;
        }
    }

    return found;
}

int main()
{
    std::string s = "unlock_the_door.value=1 AND turn_of_car.checkSum=1";

    std::cout << std::boolalpha
              << check( s, "lock" )
              << std::endl;

    std::cout << std::boolalpha
              << check( s, "unlock" )
              << std::endl;

    return 0;
}

输出

false
true

答案 2 :(得分:0)

用下划线将句子拆分为分隔符。 并使用strcmp函数。 可能应该解决。

答案 3 :(得分:0)

如果我做得对,你想看看这个词是否包含在句子中,还包含在这句话中的单词中。 你可以这样做:

bool check (std::string sentence, std::string word)
{
    std::string part;
    for(unsigned int ii=0; ii<sentence.size()-word.size(); ii++)
    {
        part = sentence.substr(ii,word.size());
        if(!part.compare(word)) {
            return true;
        }
    }
    return false;
}

如果它等于单词,则检查长度为word.size()的句子的每个部分。如果等于,则返回true,否则为false。

好的,我之前写的可能正是你不想要的。如果您只想与句子中的单词进行比较(对于您而言,您必须考虑分隔符),那么您可以这样做(您需要包含string.h):

bool check (std::string sentence, std::string word)
{
char *c_str_sentence = new char[sentence.size()+1]; //you need this cause string.c_str() will return const char* but strtok needs char*;
char *c_str_word = new char[word.size()+1];

strcpy(c_str_sentence,sentence.c_str());
strcpy(c_str_word,word.c_str());

bool is_contained = false;

const char *delimiters = " _=.";    //any delimiter you wish;

char *part = strtok(c_str_sentence,delimiters);
while (part != NULL)
{
    if(!strcmp(part,c_str_word)) {
        is_contained = true;
        break;
    }
    part = strtok(NULL,delimiters);
}

delete[] c_str_sentence;
delete[] c_str_word;

return is_contained;
}

如果您检查&#34;解锁&#34;则返回true不是为了锁定&#34;。但是,通过指定分隔符,您可以指定您希望将其视为单词以及您不喜欢的内容。

答案 4 :(得分:0)

你可以使用C ++ 11 regex_search作为搜索模式,用词边界(\b)或下划线包围你的单词。

#include <iostream>
#include <string>

using namespace std;

bool check(const string &sentence, const string &word) {
    string boundary = "(_|\\b)";
    return regex_search(sentence, regex(boundary + word + boundary));
}

int main () {
    string sentence = "unlock_the_door.value=1 AND turn_of_car.checkSum=1";
    cout << check(sentence, "lock") << endl;
    cout << check(sentence, "unlock") << endl;
}

如果您不想使用C ++ 11,或者您使用的是不支持C ++ 11正则表达式的编译器(例如4.9.0之前的gcc版本),则可以使用{{3} }。您只需要下载库并将这两行添加到源中:

#include <boost/regex.hpp>
using namespace boost;

另请记住将选项-lboost_regex传递给gcc。