Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 替换未知子字符串?_String - Fatal编程技术网

String 替换未知子字符串?

String 替换未知子字符串?,string,String,我想要一个最终输出字符串“颜色是绿色、红色和紫色。我更喜欢黑色。”您可以不使用replace进行操作。只需迭代输入字符串,并将原始字符串的部分(不包含在括号中)和替换词(而不是包含在括号中的部分)添加到StringBuilder public static String updatedStr(){ String [] ar= {"green","red","purple","black"}; String str="The colors are (blue), (blue), and

我想要一个最终输出字符串“颜色是绿色、红色和紫色。我更喜欢黑色。”

您可以不使用
replace
进行操作。只需迭代输入
字符串
,并将原始
字符串
的部分(不包含在括号中)和替换词(而不是包含在括号中的部分)添加到
StringBuilder

public static String updatedStr(){

  String [] ar= {"green","red","purple","black"};
  String str="The colors are (blue), (blue), and (yellow). I prefer (orange)";
此方法返回:

public static String updatedStr()
{
    String [] ar= {"green","red","purple","black"};
    String str="The colors are (blue), (blue), and (yellow). I prefer (orange)";

    StringBuilder out = new StringBuilder ();
    int x = 0;
    int pos = 0;
    for(int i = str.indexOf('(', 0); i != -1; i = str.indexOf('(', i + 1)) {
        out.append (str.substring(pos,i)); // add the part between the last ) and the next (
        out.append (ar[x++]); // add replacement word
        pos = str.indexOf(')', i) + 1;
    }
    out.append (str.substring(pos)); // add the part after the final )
    return out.toString ();
}

这段代码做了一些简化的假设。例如,replacements数组中的元素数应至少与要替换的字数相同。更完整的实现应该包含额外的检查。

您可以通过计算要替换的位置并将其保存在数组中来完成此操作,如下所示:

The colors are green, red, and purple. I prefer black
公共静态字符串updatedStr(){
字符串[]ar={“绿色”、“红色”、“紫色”、“黑色”};
String str=“颜色是(蓝色)、(蓝色)和(黄色)。我更喜欢(橙色)”;
ArrayList arr=新的ArrayList();
int pos[]=new int[ar.length];//在此处保存位置
对于(int i=str.indexOf('(',0);i!=-1;i=str.indexOf('(',i+1)){
arr.add(str.substring(i+1,str.indexOf('),i));
pos[arr.size()-1]=i;//保存它!
}
//从右到左更换
对于(int j=pos.length-1;j>=0;j--){
字符串newStr=str.substring(0,pos[j]+1)+ar[j]+str.substring(str.indexOf('),pos[j]+1),str.length());
str=newStr;
}
返回str;
}

这里的诀窍是,我从右到左进行替换,以便在替换时需要替换的位置不会移动。

这听起来不容易。您必须构建一个“参数”列表:查找每个参数的开始和结束,例如(蓝色)。and store(argPos、fromPos、toPos):在步骤2中,一步一步地构建整个字符串,并用替换项替换参数是否将括号保留在最终字符串中?不,我不希望在最终字符串中使用括号谢谢!我试图在一个实例中实现这一点,其中ar={“green”,“red”}。在这种情况下,从右到左替换会得到不正确的输出。我希望输出为“颜色为绿色、红色和(黄色)。我更喜欢(橙色)”,以便为适当的位置提供替换,而字符串的其余部分不变。你有什么方法可以做到这一点吗?我不知道你的意思,你的例子在括号的使用上是不一致的。您有比ar中的值更多的插槽要替换吗?非常感谢!我目前正试图得到“颜色是绿色,红色和(黄色)。我更喜欢(橙色)”当ar={“绿色”,“红色”}。任何提示都会有帮助。
public static String updatedStr(){

      String [] ar= {"green","red","purple","black"};
      String str="The colors are (blue), (blue), and (yellow). I prefer (orange)";
      ArrayList<String> arr = new ArrayList<String>();
      int pos [] = new int[ar.length]; // save locations here

      for(int i = str.indexOf('(', 0); i != -1; i = str.indexOf('(', i + 1)) {
          arr.add(str.substring(i + 1, str.indexOf(')', i)));
          pos[arr.size()-1] = i; // save it!
      }

      // replace from right to left
      for (int j=pos.length-1;j>=0;j--){
          String newStr = str.substring(0, pos[j]+1) + ar[j] + str.substring(str.indexOf(')',pos[j]+1), str.length());
          str = newStr;
      }

     return str;
}