C ++在没有正则表达式的字符串中查找Word

时间:2015-11-08 21:28:19

标签: c++ string find word

我正在尝试在字符串中找到某个单词,但单独找到该单词。例如,如果我有一个单词bank:

Neo4j

我只希望找到值3的匹配,因为其他值不完全匹配。我使用了普通的string :: find函数,但找到了单词bank中所有四个值的匹配项,因为它们都包含 3。

值周围没有空格,我不允许使用正则表达式。我正在寻找完成此任务的最快实现。

2 个答案:

答案 0 :(得分:0)

所有这些都取决于单词的定义:它是一个与其他空格分开的字符串吗?或者其他单词分隔符(例如昏迷,点,分号,冒号,parenntheses ......)是否相关?

如何解析没有正则表达式的单词:

这是一种使用find()及其变体find_first_of()

的可加入方法
string myline;     // line to be parsed
string what="3";   // string to be found
string separator=" \t\n,;.:()[]";  // string separators
while (getline(cin, myline)) {
    size_t nxt=0;
    while ( (nxt=myline.find(what, nxt)) != string::npos) {  // search occurences of what
        if (nxt==0||separator.find(myline[nxt-1])!=string::npos) { // if at befgin of a word
            size_t nsep=myline.find_first_of(separator,nxt+1);   // check if goes to end of wordd
            if ((nsep==string::npos && myline.length()-nxt==what.length()) || nsep-nxt==what.length()) {
                cout << "Line: "<<myline<<endl;    // bingo !!  
                cout << "from pos "<<nxt<<" to " << nsep << endl; 
            }
        }
        nxt++;  // ready for next occurence
    }
}

这里是online demo

原则是检查发现的出现是否与单词相对应,即是在字符串的开头还是单词的开头(即前一个字符是分隔符),并且它一直持续到下一个分隔符(或结束)线)。

如何解决您的真正问题:

您可以使用最快的单词搜索功能:如果您使用它来解决计算单词的问题,正如您在评论中所解释的那样,您将浪费很多精力!

实现这一目标的最佳方法当然是使用map<string, int>来存储/更新文件中遇到的每个字符串的计数器。

然后您只需要将每行解析为单词(您可以使用上面建议的find_fisrst_of())并使用地图:

 mymap[word]++; 

答案 1 :(得分:0)

如果要计算单词,则应使用字符串int map。使用>>将文件中的单词读入字符串,然后相应地增加地图

string word;
map<string,int> count;
ifstream input("file.txt");
while (input.good()) {
    input >> word;
    count[word]++;
}

使用>>的好处是您不必担心空格。