我想在每个元音之前添加“OB”。 样本输入:“这是一个测试” 样本输出:“THOBIS OBIS OBA TOBEST” 我不知道为什么我的代码不起作用:
public static String obify(String test) {
int x = 0;
while (x != -1) {
if (test.charAt(x) == 'A' || test.charAt(x) == 'E' || test.charAt(x) == 'I' || test.charAt(x) == 'O' || test.charAt(x) == 'U') {
test = test.replace(test.substring(x, x+1), "ob" + test.substring(x, x+1));
x += 3;
} else {
x++;
}
if (x >= test.length() - 1) {
x = -1;
}
}
return test;
}
答案 0 :(得分:4)
简单正则表达式的完美场景
String foo = "hEllo what's up?";
String rep = foo.replaceAll("(?i)([aeiou])", "OB$1");
System.out.println(rep);
答案 1 :(得分:0)
你应该替换
test = test.replace(test.substring(x, x+1), "ob" + test.substring(x, x+1));
与
test = test.substring(0, x) +
"ob" +
test.substring(x, x + 1) +
test.substring(x + 1);
您的问题是replace
会对其出现的第一个参数进行操作。
当你有" THOBIS 我 S A TEST"并尝试更换标记的字母,以替换它们"我"信件。之后,在第二个" I"之前将点指向完全错误的位置。迟早你会再次遇到它,情况会重演。
答案 2 :(得分:0)
您的问题出在replace
来电。
Documentaion告诉它用新的子串替换每个子串。
所以你的字符串无限增长:
在第一次更换之后是:“THOBIS obIS A TEST”
下一个之后是:“THobobIS obobIS A TEST”
然后“THobobobIS obobobIS A TEST”
等等...
如果您更改了行
test = test.replace(test.substring(x, x+1), "ob" + test.substring(x, x+1));
到
test = test.substring(0, x) + "ob" + test.substring(x);
它会完成这项工作。
此外,您可以将条件更改为x < test.length()
并删除第二个if。
答案 3 :(得分:0)
我认为这样比较容易:对于“ GTREIS”一词: 我基本上会使用元音(包括元音)之前和之后的内容,并将“ OB”附加到第一部分,附加其余部分,最后用修改后的字符串替换原始字符串。
public static String obify(String s)
{
String inloc ="OB",aux="";
String start="";
int n=s.length();
int i=0;
while (i<n)
{
if(s.charAt(i)=='A'|| s.charAt(i)=='E' || s.charAt(i)=='I' || s.charAt(i)=='O'||s.charAt(i)=='U' ){
inloc ="OB";
start="";
aux=s.substring(i);//EIS
System.out.println(aux);
start=s.substring(0,i);//GTR
System.out.println(start);
start=start+inloc;//GTROB
System.out.println(start);
start=start+aux;
s=start;
i+=3;// here you have to jump over OBE for example and search the next vowel
n+=2;
} else {
i++;
}
}
return s;
}