This question already has answers here:
How can I implement an efficient whole-word string replacement in C++ without regular expressions?

(2个答案)


2年前关闭。




努力寻找一种用“他或她”代替“他”,用“他或她”代替“他”的方法,而不像我的代码那样用“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。不是该死的东西符合我的需求。
提前感谢

最佳答案

通过继续已有的工作,有多种方法可以实现您想要做的事情,以使其正常工作,您将具有:(快速注意,这将是概念或伪代码,在未使用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)
    
  • 制作单词列表( vector ),然后替换那些

  • 首先,我们假设something between two white spaces定义了一个单词,由于多种原因,该单词固有错误:
  • 句子的第一个/最后一个单词将不会以空格开头/结尾。
  • 最后一个单词可能以标点符号结尾,例如.!,在上一个示例
  • 中将不起作用
  • 字符串内的标点符号:he, him and her不起作用
  • he/her这样的特殊标志将再次不起作用。

  • 在这种情况下,我们想要做的就是通过使用包含可能会分隔单词的特殊字符的正则表达式(Regex in C++)来分隔单词。在这里,您可能想做的事情有很多可能性。
  • 您可能想通过分割所有特殊字符来定界一个单词(取决于您使用的方式,最终可能会丢失中文字符等)
  • 您可能要创建一个拆分 list :,: ;_.!?/~'",依此类推。

  • 因此,在执行如下操作(伪)之后:
    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),而不是简单地在标点符号上进行分割。 comple正则表达式的另一种替代方法是:
  • 首先遍历字符串,并在标点符号前后添加空格
  • 通过仅在空格上拆分,将其拆分为一个列表
  • 替换过程
  • 将字符串重新组合在一起


  • 其他完全取决于您的实际目标,期望作为源数据的对象,等等。
  • 但是我不想要正则表达式...(那么Read the duplicate comment)
  • 关于c++ - 用另一个单词替换字符串中的单个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50936161/

    10-11 01:03
    查看更多