奇怪的String.replace()函数返回

时间:2017-03-05 22:23:03

标签: java

好的,所以我有这个函数,假设返回一个字符串替换了一些字符

String x = "DannyKrosis@Gmail.com";

private String Algorithm() {

    for (int a = 0; a < x.length(); a++)
    {

        switch (x.charAt(a)) { // Goes over each character until the '@' character is found
        case '@':
            x = x.replace(x.charAt(a), ' '); // Replaces the '@' character with blank space

            for (int b = a; b >= 0; b--) // From where the '@' was, replaces all characters before it
            {
                x = x.replace(x.charAt(b), ' ');
            }
            break;
        }
    }

    return x.replaceAll("\\s+", ""); // Removes all spaces to make string clean :)
}

当此函数返回我得到的字符串

"Gml.cm"

当我想要它时

"Gmail.com"

所以我尝试了这个功能,希望得到我想要的结果

String x = "DannyKrosis@Gmail.com";

private String Algorithm() {

    boolean y = false;  

    for (int a = 0; a < x.length(); a++)
    {
        switch (x.charAt(a)) {

        case '@':
            x = x.replace(x.charAt(a), ' '); // Removes '@' symbol from string

            x = x.replaceAll("\\s+", ""); // Removes all excess spaces

            y = true; // Stops for loop

            break;

        default:
            x = x.replace(x.charAt(a), ' '); // Replaces all other character before the '@' character with spaces
            break;
        }

        if (y) // Stops for loop
        {
            break;
        }
    }

    return x;
    }

令我惊讶的是,我得到了同样的结果

"Gml.cm"

有没有人知道我的循环或switch语句有什么问题?我似乎无法找到导致此问题的问题。

3 个答案:

答案 0 :(得分:2)

您似乎只想从电子邮件地址获取域名。这很简单:假设你在字符串中有一个@,只需返回以下子字符串:

return x.substring(x.indexOf('@') + 1);

(感谢GrzegorzGórkiewicz在评论中指出我的错误)

但是,上面代码中意外输出的原因是你误解了String.replace(char, char)的作用:它用第二个参数替换第一个参数的所有次出现。这可能令人困惑,因为也有replaceAll方法;也是如此,但使用正则表达式进行匹配和替换。

与代码类似的最佳方法是使用StringBuilder:这允许您改变当前索引处的单个字符:

StringBuilder s = new StringBuilder(x);
for (int a = 0; a < x.length(); a++) {
  char c = s.charAt(a);
  s.setCharAt(a, ' ');
  if (c == '@') {
    // Replace the spaces, etc, like above.
    x = s.toString().replaceAll("\\s+", "");
    return x;
  }
}
x = s.toString();
return x;

请注意,其中一个案例为default的双案例开关更容易编写为条件:y变量可能仅用于帮助您打破循环;如果您不在break,则可以直接使用switch(无论如何,您可以使用带标签的中断或return)。

答案 1 :(得分:1)

x.replace(x.charAt(a), ' ')替换它找到的字符。就像它在你的循环中找到a和i并从gmail替换a和i。

在您的字符串DannyKrosis@Gmail.com中,有一个和我在@之前创建的内容,因此x.replace(x.charAt(a), ' ')a替换igmail

replace方法替换与给定字符匹配的所有字符,而不是仅替换给定索引

如果你想在@之后获得价值,你可以简单地使用lookbehind regex:

(?<=@).*

答案 2 :(得分:0)

由于其他两个帖子已经解决了您的代码问题并提出了实现目标的解决方案,我只想在答案中分享一个替代方案。

groupID