我正在进行Java的CodingBat练习。我已经起床this problem,问:
给定一个字符串,返回一个已删除所有
"x"
的版本。除了开始或结束时"x"
之外,不应删除。
我想通过检查第二个字符串的倒数第二个字符来解决这个问题。如果字符为x
,请将其替换为空字符。这是我的代码:
public String stringX(String str) {
String newStr = "";
for (int i = 1; i < str.length()-1; i++) {
if (str.indexOf('x') == i) {
newStr += str.replace('x', '\u0000');
}
}
return newStr;
}
结果是,如果字符串以x
开头,它似乎不会返回任何传入的字符串:
System.out.println(test.stringX("xxHxix"));
返回(空白)
System.out.println(test.stringX("abxxxcd"));
返回abcd
System.out.println(test.stringX("xabxxxcdx"));
返回(空白)
我真的无法弄清楚发生了什么,但我希望能够在看到答案之前理解它。
将char
连接到string
是否有问题?我应该使用substring
吗?
答案 0 :(得分:3)
您可以使用string.replaceAll
功能。以下正则表达式将删除除开始或结尾处的所有x
。
System.out.println("xxHxix".replaceAll("(^x|x$)|x", "$1"));
System.out.println("xabxxxcdx".replaceAll("(^x|x$)|x", "$1"));
<强>输出:强>
xHix
xabcdx
^x
会匹配一行开头的x
。 ^
主播声称我们刚开始。x$
会与最后的x
相匹配。(..)
称为捕获组,通常用于捕获字符。因此,(^x|x$)
会在结尾处捕获起始x
或x
。 |x
或者匹配剩余字符串中的所有x
。 |
称为正则表达式交替运算符。因此(^x|x$)|x
将匹配位于中间的所有x
,并捕获开头或结尾处的所有x
。 x
(位于开头或结尾处)如果您想进行不区分大小写的匹配,请在开头添加(?i)
修饰符
"(?i)(^x|x$)|x"
答案 1 :(得分:3)
if (str.indexOf('x') == i) {
newStr += str.replace('x', '\u0000');
}
这将始终返回相同的结果,第一次出现char x
。如果第一次出现x != i
,它将永远不会进入if语句。
这应该有效:
public String stringX(String str) {
for (int i = 1; i < str.length() - 1; i++) {
if (str.charAt(i) == 'x') {
str.deleteCharAt(i);
}
}
return str;
}
编辑:删除了不必要的变量声明。
答案 2 :(得分:1)
您正在创建newStr
并替换其上的每个x
。因为str.replace('x', '\u0000');
会这样做。
您要做的是使用方法charAt(x)
检查特定字符并使用它创建新字符串或删除当前字符串上的匹配索引。