我正在尝试构建一个最终方法,该方法将采用
等字符串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;
}
答案 0 :(得分:2)
调试代码的最佳方法通常是删除它。更少的代码意味着你必须做得更少,而且潜伏着虫子的地方就越少。
因此,试试这个:
while (input.matches(".*\\*.*\\*.*")) {
String starred = input.replaceAll("[^*]*[*]([^*]+).*", "$1");
input = input.replace("*" + starred +"*", starred.toUpperCase());
}
这适用于:
此代码还处理奇数个星号,在这种情况下,忽略最后一个(奇数)星号,因为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)
可能你可以按照下面的功能进行操作
检查这是否可以帮助您
答案 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;
}
}
}