如何找到句子中第一个带有'w'的单词

时间:2010-03-14 08:43:36

标签: c++ text-search

我怎样才能在句子中找到第一个带有'w'字符的单词。这个字符可以出现在我的单词中。例句“你好xyzwy!你在这做什么?”所以结果应该是“xyzwy”。

3 个答案:

答案 0 :(得分:3)

从第一个字符开始直到最后一个字符串。检查你是否遇到'w'。如果是,请回溯直到您点击单词分隔符(例如空格)或者到达字符串的开头,然后打印所有字符,直到遇到另一个单词分隔符(或字符串的结尾)。

string Str;
getline(cin, Str);

for ( int i = 0; i < Str.length(); ++i )
  if ( Str[i] == 'w' )
  {
    // backtrack and print
    break;
  }

或者使用字符串类的find method来搜索你,然后你只需要识别这个词。

答案 1 :(得分:1)

boost::optional<std::string>
find_word_with(std::string const& haystack, std::string const& needle) {
  std::istringstream ss (haystack);
  for (std::string word; ss >> word;) {
    if (word.find(needle) != word.npos) {
      return boost::optional<std::string>(word);
    }
  }
  return boost::optional<std::string>();
}

std::string const whitespace = " \t\r\n\v\f";
boost::optional<std::string>
find_word_with2(std::string const& haystack, std::string const& needle) {
  typedef std::string::size_type Pos;

  Pos found = haystack.find(needle);
  if (found == haystack.npos) {
    return boost::optional<std::string>();
  }

  Pos start = haystack.find_last_of(whitespace, found);
  if (start == haystack.npos) start = 0;
  else ++start;

  Pos end = haystack.find_first_of(whitespace, found+1);
  if (end == haystack.npos) end = haystack.length();

  return boost::optional<std::string>(haystack.substr(start, end - start));
}

这两个单词只在空格上分开(我错过了你想要的“xyzwy”而不是“xyzwy!”),但你可以修改它们以忽略标点符号。第一个不太适合,但第二个可以很容易地修改为使用 find_first / last_ 而不是 _of ,相当于正则表达式\w(“ ABC..abc..012 .._“)而不是检查空格。

请注意,第二个,使用硬编码的空白变量,不是区域设置感知的,因为流解决方案是(它使用最后设置的全局区域设置),但它可能正是您想要的。

int main() {
  {
    boost::optional<std::string> r =
      find_word_with("Hi xyzwy! what are you doing here?", "w");
    if (!r) std::cout << "not found\n";
    else std::cout << "found: " << *r << '\n';
  }
  {
    boost::optional<std::string> r =
      find_word_with2("Hi xyzwy! what are you doing here?", "w");
    if (!r) std::cout << "not found\n";
    else std::cout << "found: " << *r << '\n';
  }
  return 0;
}

答案 2 :(得分:1)

如果你真的需要正则表达式,你可以使用

\w*w\w*

例如:

#include <boost/regex.hpp>
#include <string>
#include <iostream>
using namespace boost;
using namespace std;

int main () {
    string s;
    getline(cin, s);
    match_results<string::const_iterator> m;
    if (regex_search(s, m, regex("\\w*w\\w*"))) {
        cout << "Found: " << string(m[0].first, m[0].second) << "\n";
    } else {
        cout << "Not found\n";
    }
    return 0;
}