Как найти полное слово (не его часть) в строке в C ++
4858 просмотра
6 ответа
53 Репутация автора
В коде C ++ я пытаюсь найти слово в предложении, но он продолжает выполнять частичный поиск. Я хочу, чтобы он искал только полное слово, а не его части, помощь?
size_t kk;
string word="spo";
string sentence="seven spoons";
kk=sentence.find(word);
if (kk !=string::npos)
cout << "something" << endl;
Автор: user2949483
Источник
Размещён: 19.03.2014 07:40
Ответы (6)
2 плюса
3336 Репутация автора
Здесь есть несколько вариантов:
а) искать [space]WORD[space]
вместо простоWORD
string word="spo";
string sentence="seven spoons";
kk=sentence.find(" "+word+" ");
Обратите внимание, что это не будет работать, если ваши слова разделены символами новой строки или другими пробелами.
б) Разбейте строку на слова, сохраните их в a vector
и проверьте, находится ли искомое слово где-нибудь в векторе, используя std::find
.
stringstream parser(sentence);
istream_iterator<string> start(parser);
istream_iterator<string> end;
vector<string> words(start, end);
if(find(words.begin(), words.end(), word)!=words.end()) cout<<"found!";
Если вы будете часто искать слова, возможно, это лучший выбор, поскольку вы можете хранить вектор где-нибудь для дальнейшего использования, поэтому вам не нужно его разбивать. Кроме того - если вы хотите, чтобы это работало, обязательно #include <algorithm>
и #include <vector>
.
в) Найдите слово и проверьте,isspace(string[position-1]) && isspace(string[position+wordLength])
string word="spo";
string sentence="seven spoons";
kk=sentence.find(" "+word+" ");
if(kk!=string::npos){
if((kk==0 || isspace(sentence[kk-1])) && (kk+word.length()==sentence.length() || isspace(kk+word.length()+1)))
cout << "found!";
}
Автор: Paweł Stawarz
Размещён: 19.03.2014 07:46
1 плюс
48118 Репутация автора
Я думаю, что лучший способ - разделить вашу строку, используя пробелы и знаки препинания в качестве разделителей, а затем использовать std::find
результат.
#include <boost/algorithm/string.hpp>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::string word="spo";
std::string sentence="seven spoons";
std::vector<std::string> words;
boost::split(words, sentence, boost::is_any_of("\n\t .,!?\"()"));
auto match = std::find(begin(words), end(words), word);
if (match != end(words))
{
// Found it!
}
else
{
// Not there.
}
}
Автор: Fred Larson
Размещён: 19.03.2014 07:49
2 плюса
34748 Репутация автора
Что-то вроде этого :
std::size_t kk;
std::string word="spoo";
std::string sentence="seven spoons tables";
std::stringstream ss(sentence) ;
std::istream_iterator<std::string> f ;
auto it =std::find_if( std::istream_iterator<std::string> (ss),
f,
[=](const std::string& str){
return str == word;
}
);
if(it != f )
std::cout << "Success" <<std::endl;
Смотри здесь
Автор: P0W Размещён: 19.03.2014 07:561 плюс
41 Репутация автора
string word="spo";
string sentence="seven spoons";
string::size_type nIndex = sentence.find( word, 0 );
if( nIndex != string::npos )
{
if ((nIndex + word.length() + 1) == sentence.length())
{
cout << "Found" << endl;
}
else
{
string::size_type nSpace = sentence.find( " ", nIndex );
if (nSpace == (nIndex + word.length()))
{
cout << "Found" << endl;
}
}
}
else
{
cout << "No Match" << endl;
}
Автор: Udai Bhaskar
Размещён: 19.03.2014 08:13
8 плюса
71537 Репутация автора
Похоже, что то, что вы хотите, обрабатывается концепцией границ слов или символов слов в регулярных выражениях.
Вот программа, которая вернет только полное совпадение. Таким образом, он вернет слово только в том случае, если это слово полностью соответствует слову, которое вы ищете. Если какое-то слово sentence
содержит целевое слово в качестве строгой подстроки, оно не будет возвращено.
#include <regex>
#include <string>
#include <iostream>
int main() {
std::string word = "spo"; // spo is a word?
std::string sentence = "seven spoons";
std::regex r("\\b" + word + "\\b"); // the pattern \b matches a word boundary
std::smatch m;
if (std::regex_search(sentence, m, r)) { // this won't find anything because 'spoons' is not the word you're searching for
std::cout << "match 1: " << m.str() << '\n';
}
sentence = "what does the word 'spo' mean?";
if (std::regex_search(sentence, m, r)) { // this does find the word 'spo'
std::cout << "match 2: " << m.str() << '\n';
}
}
Или, возможно, вы хотите сказать, что хотите найти любое слово, которое соответствует частичному слову, которое вы ищете. регулярные выражения также могут сделать это:
std::string partial_word = "spo";
std::regex r("\\w*" + partial_word + "\\w*"); // the pattern \w matches a word character
Это производит:
match 1: spoons
match 2: spo
Автор: bames53
Размещён: 19.03.2014 08:17
0 плюса
1 Репутация автора
Кажется, это сработало.
#include <string>
/*find word in sentence and return the index of first occurrence*/
int find_whole(string sentence,string word){
size_t pos=sentence.find(word);
size_t offset=pos+sentence.size()+1;
if((pos!=string::npos) && (sentence.substr(pos,offset)==word))
return pos;
return string::npos;
}
Автор: FakeName2233
Размещён: 11.08.2019 07:49
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- c++ Что такое виртуальный базовый класс в C ++?
- string В чем разница между строкой и строкой в ??C #?
- string Почему в Ruby нет реального StringBuffer или StringIO?
- string Преобразовать строку в перечисление в C #
- string Преобразование списка <Integer> в список <String>
- string Самый эффективный способ объединения строк?
- string Экранирование строк HTML с помощью jQuery
- find Как искать многострочный шаблон в файле?
- find Семантическая разница между «Найти» и «Поиск»?
- find Как я могу найти элементы управления WPF по имени или типу?
- find Как применить команду оболочки ко многим файлам во вложенных (и плохо экранированных) подкаталогах?
- find Как я могу исключить все «отклоненные разрешения» сообщения из «find»?
- find Чистый способ найти объекты ActiveRecord по id в указанном порядке