我正在尝试在字符串中找到某个单词,但单独找到该单词。例如,如果我有一个单词bank:
Neo4j
我只希望找到值3的匹配,因为其他值不完全匹配。我使用了普通的string :: find函数,但找到了单词bank中所有四个值的匹配项,因为它们都包含 3。
值周围没有空格,我不允许使用正则表达式。我正在寻找完成此任务的最快实现。
答案 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]++;
}
使用>>
的好处是您不必担心空格。