String C++;用字符串中的空格替换非字母/撇号

String C++;用字符串中的空格替换非字母/撇号,string,c++11,replace,String,C++11,Replace,我正在阅读一个文本文件,并将单词解析成一个映射,以计算每行中每个单词的出现次数。我被要求忽略所有非字母字符(标点符号、数字、空格等),撇号除外。我可以用下面的代码找出如何删除所有这些字符,但这会导致不正确的单词,比如“一两个”变成“一两个”,应该是两个单词,“一个”和“两个” 相反,我现在尝试用空格替换所有这些值,而不是简单地删除,但不知道如何做到这一点。我认为replace-if算法是一个很好的算法,但无法找到正确的语法来实现这一点。C++11很好。有什么建议吗 示例输出如下所示: "firs

我正在阅读一个文本文件,并将单词解析成一个映射,以计算每行中每个单词的出现次数。我被要求忽略所有非字母字符(标点符号、数字、空格等),撇号除外。我可以用下面的代码找出如何删除所有这些字符,但这会导致不正确的单词,比如“一两个”变成“一两个”,应该是两个单词,“一个”和“两个”

相反,我现在尝试用空格替换所有这些值,而不是简单地删除,但不知道如何做到这一点。我认为replace-if算法是一个很好的算法,但无法找到正确的语法来实现这一点。C++11很好。有什么建议吗

示例输出如下所示:

"first second" = "first" and "second"
"one-two" = "one" and  "two"
"last.First" = "last" and "first"
"you're" = "you're"
"great! A" = "great" and "A"

// What I initially used to delete non-alpha and white space (apostrophe's not working currently, though)

// Read file one line at a time
while (getline(text, line)){
    istringstream iss(line);            
    // Parse line on white space, storing values into tokens map
    while (iss >> word){
        word.erase(remove_if(word.begin(), word.end(), my_predicate), word.end());
        ++tokens[word][linenum];
    }
    ++linenum;
}

bool my_predicate(char c){
    return c == '\'' || !isalpha(c); // This line's not working properly for apostrophe's yet
}
您可以使用在将输入行发送到istringstream之前对其进行预处理。这也将简化您的内部循环

while (getline(text, line)){
    replace_if(line.begin(), line.end(), my_predicate, ' ');
    istringstream iss(line);            
    // Parse line on white space, storing values into tokens map
    while (iss >> word){
        ++tokens[word][linenum];
    }
    ++linenum;
}
您可以使用在将输入行发送到istringstream之前对其进行预处理。这也将简化您的内部循环

while (getline(text, line)){
    replace_if(line.begin(), line.end(), my_predicate, ' ');
    istringstream iss(line);            
    // Parse line on white space, storing values into tokens map
    while (iss >> word){
        ++tokens[word][linenum];
    }
    ++linenum;
}
您可以使用在将输入行发送到istringstream之前对其进行预处理。这也将简化您的内部循环

while (getline(text, line)){
    replace_if(line.begin(), line.end(), my_predicate, ' ');
    istringstream iss(line);            
    // Parse line on white space, storing values into tokens map
    while (iss >> word){
        ++tokens[word][linenum];
    }
    ++linenum;
}
您可以使用在将输入行发送到istringstream之前对其进行预处理。这也将简化您的内部循环

while (getline(text, line)){
    replace_if(line.begin(), line.end(), my_predicate, ' ');
    istringstream iss(line);            
    // Parse line on white space, storing values into tokens map
    while (iss >> word){
        ++tokens[word][linenum];
    }
    ++linenum;
}
如果和撇号,或者不是字母字符,则要删除该字符

由于要替换这些,应使用:

你也应该纠正你的谓词:

return !isalpha(c) && c != '\'';
如果和撇号,或者不是字母字符,则要删除该字符

由于要替换这些,应使用:

你也应该纠正你的谓词:

return !isalpha(c) && c != '\'';
如果和撇号,或者不是字母字符,则要删除该字符

由于要替换这些,应使用:

你也应该纠正你的谓词:

return !isalpha(c) && c != '\'';
如果和撇号,或者不是字母字符,则要删除该字符

由于要替换这些,应使用:

你也应该纠正你的谓词:

return !isalpha(c) && c != '\'';