努力寻找一种方法,用“他或她”代替“他”,用“他或她”代替“他”,而不用下面的代码代替“ the”或“ the”:>
#include <iostream>
#include <string>
using namespace std;
void myReplace(string& str, const string& oldStr, const string& newStr)
{
if (oldStr.empty())
{
return;
}
for (size_t pos = 0; (pos = str.find(oldStr, pos)) != string::npos;)
{
str.replace(pos, oldStr.length(), newStr);
pos += newStr.length();
}
}
int main()
{
string searchStr;
Beginning:
cout << "Please enter a sentence (Maximum of 100 characters)\n"
<< "Or type 'exit' to close the program\n";
getline(cin, searchStr);
cout << "\nYour input:\n\t" << searchStr;
myReplace(searchStr, "he", "he or she");
cout << "\nReplaced Text\n\t" << searchStr << "\n\n";
goto Beginning;
}
我的程序做什么...
Input: He is the man
Output: He or she is the or she man
它应该做什么...
Input: He is the man
Output: He or she is the man
任何人都可以帮助我解决这个问题。 如果您要询问...是的,我到处搜索过Google。不是该死的东西符合我的需求。 提前感谢
答案 0 :(得分:0)
通过继续使用已有的东西,有多种方法可以实现您想做的事情,以使其起作用,您将拥有:(快速说明,它是概念或伪代码,没有使用过C ++在相当长的时间内)
当您尝试匹配单词时,就像您说的如果单词包含he
一样,它将被替换,因此:the
变成the or she
。
要解决此问题,您需要考虑一个单词前后ussually
(后面会详细介绍)的含义。通常它是一个空白。这意味着一个快速的解决方法是替换“ he”而不是“ he”。
因此,像The something he something
这样的情感确实会给我们The something he or she something
。
但是,就像其他人所说的那样,当句子以您要替换的内容开头时,这会引起问题。这就是为什么您要在初始句子中添加一个空格before and after
。
假设“他是他的东西”作为我们的观点,它将变成“他是他的东西”,从而允许替代者工作。然后最后修剪字符串将消除多余的空格。 这样您将拥有:
searchStr = " " + searchStr + " ";
myReplace(searchStr, " he ", " he or she ");
trim(searchStr)
首先,我们假设一个词由something between two white spaces
定义,由于多种原因,该词本来是错误的:
.
或!
,在上一个示例中不起作用he, him and her
中的标点符号不起作用he/her
这样的特殊符号将再次不起作用。 在这种情况下,我们希望通过使用包含可能会分隔单词的特殊字符的正则表达式(Regex in C++)来拆分单词。在这里,您可能想做的事情有很多可能性。
,: ;_.!?/~'"
,依此类推。因此,在执行了以下操作(伪)之后:
ourString = "He, is mean to the teacher!"
delimiter = "[ ,.!?]".toRegex //whitespace and some punctuation marks
list = split(ourString, delimiter)
列表将是:[他,是对老师的意思](请注意,我们将丢失标点符号,稍后将对此进行详细介绍)
现在,我们可以简单地遍历列表,将每个元素替换为所需的元素并将其串联起来:
string = ""
for(word in list)
string+= if(word.toLowerCase == "he") " he or she " else " " word " "
现在我们将拥有" He or she is mean to the teacher "
(同样,标点符号丢失了)
如果我们要保留标点符号怎么办?
如果我们要使用相同的方法,则可以使用更复杂的正则表达式(an example in python),而不是简单地在标点符号上进行分割。替代正则表达式的另一种方法是:
string = "He, is !mean." regex = "[,!.:;]" string = replace(string, regex with " it ") //the string is now: "He , is ! mean . " // something to get rid of multiple spaces and make them into a single one normliseWhiteSpaces(string) delimiter = " " list = split(string, delimiter) //the list is now [he, ,, is, !, mean, .] string = "" for(word in list) string+= if(word.toLowerCase == "he") " he or she " else " " word " " //the string is now "He or she , is mean . " so we need to: normliseWhiteSpaces(string) trim(string)