Как искать точное слово? - PullRequest
1 голос
/ 11 июля 2020

Мне любопытно, есть ли способ найти точное слово само по себе, даже если поиск состоит из одного слова. Как вы можете видеть ниже, в выходных данных говорится, что слово «день» встречается дважды, но это только потому, что «день» также используется для написания «сегодня». Я хотел бы, чтобы поиск специально искал слово «день» и подсчитывал его, даже если оно находится в «сегодня».

Возможно ли это?

Примечание. назначение хочет, чтобы мы использовали строковые манипуляторы

//search for particular word - member function
std::cout << "Please indicate a word which you like to be found in the paragraph you entered: "; 
getline(std::cin, searchWord);

//pos determines the position in the array it's in if the word is found and goes until the end of string. 
size_t pos = 0;
int wordCount = 0;

//npos = not found OR -1.
while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    ++pos;
    ++wordCount;
}

if (wordCount == 0) {
    std::cout << "The word you entered, '" << searchWord << "', was not found." << std::endl << std::endl;
}
else {
    std::cout << searchWord << " was Found " << wordCount << " times." << std::endl << std::endl;
}'

поиск слова

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Да, это возможно. Но для этого вам необходимо решить, каковы границы слов. Например, является ли «-» границей слова пробелом? Или вы бы считали это буквой?

Вы можете, например, отфильтровать не-слова, проверив, начинается ли найденная строка:

  • как новое слово (т.е. находятся в начале строки, или предшествующий символ представляет собой нечто иное, чем буква), а
  • заканчивается как слово (т.е. либо мы достигаем последнего символа строки, либо следующий символ не является последнее).

Это выглядит так:

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    bool wstart = pos==0 || !isalpha(userParagraph[pos-1]);
    bool wend = pos+searchWord.size()==userParagraph.size() 
            || !isalpha(userParagraph[pos+searchWord.size()]);
    if (wstart && wend)
        ++wordCount;

    ++pos;
}

Онлайн-демонстрация

Внимание: работает только с кодировкой одного символа. С UTF8 это не сработает для языков, в которых используются буквы, не входящие в алфавит ascii (например, подчеркнутые буквы, такие как é, ñ, ä, ..., будут ошибочно интерпретированы как допустимые разделители слов)

1 голос
/ 11 июля 2020

Если вы найдете слово, вы можете проверить, являются ли соседние символы алфавитами, используя std::isalpha, и посчитать его, только если они не алфавиты.

while (( pos = userParagraph.find(searchWord, pos)) != std::string::npos) {
    if ((pos == 0 || !std::isalpha(userParagraph[pos - 1]))
        && (pos + searchWord.size() == userParagraph.size() 
           || !std::isalpha(userParagraph[pos + searchWord.size()]))
         ++wordCount;
    
    ++pos;  
}

и теперь слово не будет учитываться, если оно является частью другого слова.

Обратите внимание, что необходимы дополнительные проверки, чтобы убедиться, что вы не индексируете недопустимую позицию строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...