使用替换在传递的字符串内打印带有新插入替换的字符串

时间:2016-02-04 04:40:26

标签: java indexing replace uppercase

我正在尝试构建一个最终方法,该方法将采用

等字符串
I will be the *greatest* hero ever!

并将查找它们之间的开始和结束星号,无论将采取什么样的大小写,然后重新插入以查看

I will be the GREATEST hero ever!

到目前为止,我的代码只采用了星号和吐出之间的任何内容:

" GREATEST "

我一直试图纠正这个问题,并且我被告知要使用名为"替换"的功能。

我在这里找到了引用:a link

  while(n4.hasNext()) {
    sLine = n4.next();
    F1 = sLine.indexOf("*");
    L1 = sLine.indexOf("*", F1+1);
    count  = F1;
    if (count < L1){
      upperC = sLine.toUpperCase();
      sLine = upperC.replace("*",upperC);
      count++;
    }
  }
  return sLine;
}

到目前为止,这只在我尝试传递"all!"

后输出"To you the *victor* of all!"

有人可以告诉我我失踪了什么,或者至少告诉我在哪里可以纠正这个问题?

更新:

到目前为止,这里是代码,但是现在它正在打印一个句子,但是我仍然在如何用一个没有上限的单词替换星号之间的单词。额外的星号。

打印:"To you the * * *VICTOR* * * of all!"

        while(n4.hasNext()) {
            sLine = n4.next();
            s += sLine + " ";
            F1 = sLine.indexOf("*");
            L1 = sLine.indexOf("*", F1+1);
            count  = F1;
            if (count < L1){

                upperC = sLine.toUpperCase();
                s = s.replaceAll("victor",upperC);
                count++;
            }
        }
        return s;
    }

3 个答案:

答案 0 :(得分:2)

调试代码的最佳方法通常是删除它。更少的代码意味着你必须做得更少,而且潜伏着虫子的地方就越少。

因此,试试这个:

while (input.matches(".*\\*.*\\*.*")) {
    String starred = input.replaceAll("[^*]*[*]([^*]+).*", "$1");
    input = input.replace("*" + starred +"*", starred.toUpperCase());
}

这适用于:

  • 循环,而有#34;星号引用&#34;文本
  • 使用正则表达式查找(第一个)星号引用文本
  • 使用大写等效的
  • 对标准(非正则表达式)替换找到的文本
  • 回到循环开始

此代码还处理奇数个星号,在这种情况下,忽略最后一个(奇数)星号,因为while条件需要两个星号在字符串中。

更多细节

matches(".*\\*.*\\*.*")中的正则表达式表示&#34;任何字符,转义(即字面)*,任何字符,文字*,任何字符&#34;。任何一端都需要.*(任何字符),因为如果整个字符串与正则表达式匹配,matches()仅返回true。

replaceAll()调用与整个字符串匹配,但捕获字符串中第一个和第二个*字符之间的部分。打破它:

  • [^*]*任意数量的任何字符都不是*
  • [*]文字* - 相当于\\*,但看起来更酷了
  • ([^*]+)至少有一个不是*的字符,被捕获为&#34;第1组&#34;
  • .*字符串的其余部分

替换术语"$1"会放回比赛第1组中捕获的内容。

整体效果是用捕获的部分替换整个字符串 - 有效提取捕获的部分。用最少的代码抓取部分字符串是一个非常方便的习惯用法。

使用纯文本(不是正则表达式)的最终replace()不那么神秘 - 它用大写版本替换迭代的目标。

一些测试代码:

String input = "I am the *greatest* of *all* time :*)";
while (input.matches(".*\\*.*\\*.*")) {
    String starred = input.replaceAll("[^*]*[*]([^*]+).*", "$1");
    input = input.replace("*" + starred +"*", starred.toUpperCase());
}
System.out.println(input);

输出:

I am the GREATEST of ALL time :*)

答案 1 :(得分:0)

可能你可以按照下面的功能进行操作

  1. 采取您想要的任何字符序列(第一个和lsat *符号)。
  2. 将其设为字符数组。
  3. 旋转到最后一个索引。
  4. &安培;使用.toUpperCase();
  5. 检查这是否可以帮助您

答案 2 :(得分:0)

您可以使用简单的状态机。在伪代码中: -

STATE = NOT_PROCESSING_TO_UPPER
WHILE( c = getChar() )
    SWITCH STATE
         CASE NOT_PROCESSING_TO_UPPER:
              IF c == '*'
                  STATE = PROCESSING_TO_UPPER
              ELSE
                 copy c to output
              BREAK
         CASE PROCESSING_TO_UPPER:
              IF c != *
                 copy UPPER CASE c to output
              ELSE
                 STATE = NOT_PROCESSING_TO_UPPER
              BREAK
    END SWITCH
END_WHILE

这将处理由*&#39;包围的任意数量的单词。

在结束时,如果STATE仍然处理PROCESSING_TO_UPPER,则表示您的报告不匹配*,您可以报告。

这是一些经过测试的java代码。解决方案可能不是最短的,但它是可读的并处理所有情况。

private final static int PROCESSING_UPPER = 1;
private final static int NOT_PROCESSING_UPPER = 2;

private void test () {
    String sIn = "I am just *awsome* and *more*";
    String sOut = "";
    int state = NOT_PROCESSING_UPPER;

    for( int i=0; i < sIn.length(); i++) {
        char c=sIn.charAt(i);
        switch (state) {
            case NOT_PROCESSING_UPPER:
                if(c=='*')
                    state = PROCESSING_UPPER;
                else
                    sOut += c;
                break;

            case PROCESSING_UPPER:
                if (c!='*') {
                    String sTemp = "" + c;
                    sOut += sTemp.toUpperCase ();
                } else {
                    state = NOT_PROCESSING_UPPER;
                }
                break;
            default:
                // Error handling here.
                break;                
        }
    }
}