【问题标题】:How to differentiate between "0" and "00" in a string and replace substring如何区分字符串中的“0”和“00”并替换子字符串
【发布时间】:2021-05-21 19:26:25
【问题描述】:

在一个字符串中,如何将所有“0”替换为 X,将所有“00”替换为 Y,但如果超过 2 个零,则保持原样。

例如:00 0 000 0000 0

示例输出:Y X 000 0000 X

【问题讨论】:

  • 那么,单零和双零的区别是什么?事实上,在它之前和之后都有空格。这也告诉您您的替换语句如何替换它们,例如而不是替换"0" 替换" 0 ",现在只有开始和结束需要特殊处理。
  • 你可以查看正则表达式来做到这一点。

标签: java substring


【解决方案1】:

没有正则表达式的两种方法。


基于 Arvind 的三元运算符改进和 Andreas 的方法(长度)。

同时避免尾随空格,一个衬里循环。

String str = "00 0 000 0000 0";  
String[] pieces = str.split(" ");
str = "";
for (String s : pieces) {
   str += (str.length()>0 ? " ":"") + (s.length()==1 ? "X" : (s.length()==2 ? "Y" : s));
}       
//str => "Y X 000 0000 X"           

使用等于

String base = "00 0 000 0000 0";  
String[] pieces = base.split(" ");
String rep="";

for (String s : pieces)
{
   if (s.equals("0"))
       rep+="X";
   else if (s.equals("00"))
       rep+="Y";
   else
       rep+=s;
    
   rep+=" ";
}

//rep = rep.trim(); -> if need to cut off the last space
System.out.println(rep); //  Y X 000 0000 X

使用ternary (or conditional) operator,您可以进一步缩短代码:

for (String s : pieces) {
    rep += s.equals("0") ? "X" : (s.equals("00") ? "Y" : s);
    rep += " ";
}

【讨论】:

    【解决方案2】:

    在 Java 14+ 中,您可以这样做:

    String input = "00 0 000 0000 0";
    
    String result = Pattern.compile("0+").matcher(input).replaceAll(m ->
            switch (m.group().length()) {
                case 1 -> "X";
                case 2 -> "Y";
                default -> m.group();
            });
    
    System.out.println(result); // prints: Y X 000 0000 X
    

    【讨论】:

    • 哦,长度...我错过了这种方法
    【解决方案3】:

    你可以用正则表达式解决这个问题

    String listOfNumbers = "00 0 000 0000 0";
    
    listOfNumbers = listOfNumbers.replaceAll("(^| )00( |$)", " Y ");
    listOfNumbers = listOfNumbers.replaceAll("(^| )0( |$)", " X ");
    listOfNumbers = listOfNumbers.trim();
    
    System.out.println(listOfNumbers);
    

    此代码打印出Y X 000 0000 X

    它是如何工作的:首先代码检查以替换所有出现的00,接下来它将获取中间结果并检查0

    • (^| ): 我们要么期待字符串的开头,要么期待一个空格字符
    • 00:我们预计 0 字符会出现 2 次​​li>
    • ( |$): 这里我们期望一个空格,或者字符串的结尾
    • trim() 使用此代码,我们将在完整字符串的开头和结尾处有一个空格。为了解决这个问题,我们需要修剪那些。

    或者,您可以使用更复杂的正则表达式来防止最后使用修剪:

    String test = "00 0 000 0000 0";
    
    test = test.replaceAll("(?<!0)(0{2})(?!0)", "Y");
    test = test.replaceAll("(?<!0)(0{1})(?!0)", "X");
    
    System.out.println(test);
    

    此代码也打印相同的结果Y X 000 0000 X

    这是如何工作的:

    • (?&lt;!0) 确保在我们搜索之前没有多余的 0 项。这称为向后看
    • (0{2}) 检查 2 次出现的 0。或者,您也可以将 00 放在这里,而不是指定我们期望 0 两次
    • (?!0) 确保我们搜索的内容后面没有多余的 0 项。这称为前瞻

    【讨论】:

    • 如果有表达式的开头或空格,然后是 1 或 2 个零,然后是空格或表达式的结尾,则更容易替换。不需要这种前瞻/后瞻复杂性。
    • 嗯,你是对的。我会看到用更简单的正则表达式来更新答案
    • 我已经更新了代码。确实轻松了很多。感谢您的反馈。我不确定是否有办法通过这个更简单的示例来防止需要修剪。但与较硬的风格相比,这对我来说似乎是一个容易的权衡
    • 你好 Yoni,看来你的空间太大了
    • 我认为你应该从“Y”和“X”中删除空格,这样代码就可以正常工作了
    【解决方案4】:

    您可以使用,我认为最简单的方法之一如下

    替换 \b0\b by X\b00\b by Y

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2012-04-03
      • 2013-07-23
      • 1970-01-01
      相关资源
      最近更新 更多