【问题标题】:Unexpected output for looping through a string and using str.replace循环遍历字符串并使用 str.replace 的意外输出
【发布时间】:2015-06-03 14:15:32
【问题描述】:

我正在学习 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 吗?

【问题讨论】:

    标签: java string for-loop


    【解决方案1】:

    您可以使用string.replaceAll 函数。下面的正则表达式将删除所有x,除了开头或结尾的x

    System.out.println("xxHxix".replaceAll("(^x|x$)|x", "$1"));
    System.out.println("xabxxxcdx".replaceAll("(^x|x$)|x", "$1"));
    

    输出:

    xHix
    xabcdx
    

    DEMO

    • ^x 将匹配行首的 x^anchor 断言我们处于起步阶段。
    • x$ 将匹配最后的 x
    • (..) 称为捕获组,通常用于捕获字符。所以(^x|x$) 捕获了开头的x 或结尾的x
    • |x 或匹配剩余字符串中的所有 x| 称为正则表达式交替运算符。所以(^x|x$)|x 将匹配所有位于中间的x 并捕获所有位于开头或结尾的x
    • 将所有匹配的字符替换为组索引 1 中的字符将仅返回 x(位于开头或结尾)

    如果要进行不区分大小写的匹配,请在开头添加 (?i) 修饰符

    "(?i)(^x|x$)|x"
    

    【讨论】:

    • 感谢您的回复,您能解释一下replaceAll 如何与^$ 一起使用吗?
    • @Avinash Raj :可能它应该不区分大小写,但我很确定 :) 但它是一个很好的解决方案 +1
    • @Avinash Raj 太有趣了。我需要阅读正则表达式!
    【解决方案2】:
    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;
    }
    

    编辑:删除了不必要的变量声明。

    【讨论】:

    • 是的 charAtindexOf 提供不同的结果。
    • 我认为您需要StringBuilder 来换取deleteCharAt 是否正确? (PS你把它用't')
    • 是的StringBuilderStringBuffer。这是做到这一点的方法之一。您可以尝试使用Stringsubstrings 来实现,如果您不想使用它们,可以重新分配。 (PS哎呀错字:))
    【解决方案3】:

    您正在创建一个 newStr 并替换上面的每个 x。因为str.replace('x', '\u0000'); 这样做了。

    您要做的是使用方法charAt(x) 来检查特定字符并用它创建一个新字符串或删除当前字符串上的匹配索引。

    Check out the Java Doc for String

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多