0

使用 C++,假设我有一个文件,并且我正在寻找一个关键字,但我不希望它的相邻字符是 aa-z0-9.

假设我想在这样的文件中查找关键字U

U 1.2;
Under 2.3;
abcdUefg;

我希望第一行出现,而不是第二行或第三行。但请注意以下内容也可以。

"(U|B|tau)"

因为这里U只有一个词。

关键是,我希望我正在寻找的关键词是一个独立的词,而不是这个词的一部分。最好的方法是什么?

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    string line;
    vector<string> lines;
    ifstream myfile ("FILE");
    if (myfile.is_open())
    {
        while (myfile.good())
        {
            getline(myfile,line);
            lines.push_back(line);
        }
        myfile.close();
    }
    else
    {
        cout << "Unable to open file";
    }

    for (unsigned i = 0; i < lines.size(); ++i)
    {
        if (lines[i].find("keyName") != string::npos)
        {
            printf("Key found!\n");
        }
    }

    myfile.close();
    return 0;
}
4

2 回答 2

1

您需要从每一行读取每个单词并将其与键进行比较。

string word;
for (unsigned i = 0; i < lines.size(); ++i)
{
    // Read words from the line one by one. They should be space separated.
    istringstream iss(lines[i]);
    while(iss >> word) {
       size_t key_loc = word.find("U");

       if(key_loc == word.size()) {
           // Found "U" followed by space
       }
       // If not the last one in the word. Check what is next to it.
       if(key_loc < word.size() && !std::isalnum(word.at(key_loc+1)) ) {
            // Found it not followed by alphanumeric.
       }
    }
}
于 2013-04-07T21:46:52.540 回答
1

假设字符串是 ASCII az 和 0-9 你可以做..

for (unsigned i = 0; i < lines.size(); ++i)
{
    size_t pos = lines[i].find("keyName");
    size_t len = std::string("keyName").length();
    if (pos != string::npos)
    {
        if(!std::isalnum(lines[i][pos+len+1]))
            printf("Key found!\n");
    }
}

In which isalnum returns true if it's 0-9 or a-z and is located in <cctype>

于 2013-04-07T21:50:50.513 回答