循环遍历字符串并使用str.replace的意外输出

时间:2015-03-30 14:06:38

标签: java string for-loop

我正在进行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吗?

3 个答案:

答案 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

DEMO

  • ^x会匹配一行开头的x^主播声称我们刚开始。
  • x$会与最后的x相匹配。
  • (..)称为捕获组,通常用于捕获字符。因此,(^x|x$)会在结尾处捕获起始xx
  • |x或者匹配剩余字符串中的所有x|称为正则表达式交替运算符。因此(^x|x$)|x将匹配位于中间的所有x,并捕获开头或结尾处的所有x
  • 将所有匹配的字符替换为组索引1中的字符将仅返回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)检查特定字符并使用它创建新字符串或删除当前字符串上的匹配索引。

Check out the Java Doc for String