【问题标题】:How to remove leading zeros with long string如何删除长字符串的前导零
【发布时间】:2022-01-31 04:29:37
【问题描述】:

我正在尝试从 java 中有多个其他字符串和数字的字符串中删除前导零

so ow -   00250 =     00000000 ]

对于上述输入,我试图让输出成为

so ow - 250 = 0 ]

我试过了

removeLeadingZeros(str.trim().replaceAll(" +", " ")

removeLeadingZeros 在哪里

    // Regex to remove leading
    // zeros from a string
    String regex = "^0+(?!$)";

    // Replaces the matched
    // value with given string
    str = str.replaceAll(regex, "");

    return str;

但我得到了输出

so ow -   00250 =     00000000 ]

与原始输入相同。

这些方法似乎只适用于字符串中的第一个元素,如果它是一个数字,例如

00015039 so ow + - 003948 83

返回

15039 so ow + - 003948 83

但想返回

15039 so ow + - 3948 83

谢谢!

【问题讨论】:

  • 这些方法似乎只适用于字符串中的第一个元素,如果它是一个数字 ^0 表示如果字符串以零开头,也许你还想要空格后跟一个零?

标签: java regex string number-formatting


【解决方案1】:

通过将给定的字符串拆分为数组,然后删除前导零,可以正常工作。

removeLeadingZeros 是:

public static  String removeLeading(String str) {
String regex = "^0+(?!$)";
String x[] = str.split(" ");
StringBuilder z = new StringBuilder();
    
for(String y:x) {
    str = y.replaceAll(regex, "");
    z.append(" " + str);
}
return z.toString();
}

【讨论】:

    【解决方案2】:

    tl;博士

    Arrays
    .stream( input.split( " " ) )
    .filter( s -> ! s.isBlank() ) 
    .map(
        s -> {
            try{
                return String.valueOf( Integer.parseInt( s ) ) ; 
            } catch ( NumberFormatException e ) {
                return s ; 
            }
        }
    )
    .collect( Collectors.joining( " " ) )
    

    拆分为多个部分,将每个部分解析为int

    我会将字符串分成几部分,用空格字符分隔。

    input.split( " " )
    

    拆分结果为一个数组。制作该数组的流。

    String input = "so ow -   00250 =     00000000 ]" ;
    String output = 
        Arrays
        .stream( input.split( " " ) )
    …
    

    所有这些额外的空格将导致一堆空字符串,其中没有文本。所以把它们过滤掉。

    我们想消除空格和空字符串,所以调用String#isBlank而不是String#isEmpty

    .filter( s -> ! s.isBlank() ) 
    

    尝试将每个部分解析为整数。如果解析失败,则抛出异常。捕获该异常。如果被捕获,只需返回无法解析的文本。如果没有异常,返回一个新生成的int值的字符串。

    .map(
        s -> {
            try{
                int x = Integer.parseInt( s ) ;
                return String.valueOf( x ) ; 
            } catch ( NumberFormatException e ) {
                return s ;  // Dismiss the exception.
            }
        }
    )
    

    收集我们所有剩余的和新创建的部分,用空格作为分隔符。

    .collect( Collectors.joining( " " ) )
    

    代码示例

    将所有代码放在一起看起来像这样:

    String input = "so ow -   00250 =     00000000 ]" ;
    String output = 
        Arrays
        .stream( input.split( " " ) )
        .filter( s -> ! s.isBlank() ) 
        .map(
            s -> {
                try{
                    int x = Integer.parseInt( s ) ;
                    return String.valueOf( x ) ; 
                } catch ( NumberFormatException e ) {
                    return s ;  // Swallow the exception.
                }
            }
        )
        .collect( Collectors.joining( " " ) )
    ;
    System.out.println( output ) ;
    

    看到code run live at IdeOne.com

    所以 ow - 250 = 0 ]

    【讨论】:

    • 如果您使用.stream( input.split( "\\s+" ) ) 拆分,我认为您不需要进行isBlank 过滤
    【解决方案3】:

    你可以使用

    String result = text.replaceAll("\\b(?<!\\d[,.])(?:(0)+\\b|0+(?=[1-9]))", "$1").replaceAll("(?U)\\s+", " ").trim();
    

    请参阅regex demo

    根据您输入的混乱程度,您可能需要调整甚至扩展解决方案。 详情

    • \b(?&lt;!\d[,.]) - 单词边界,右边必须有字符串开头或非单词字符,当前位置左边不能有数字+点或逗号(即我们排除小数位匹配)
    • (?:(0)+\b|0+(?=[1-9])) - 两种模式之一:
      • (0)+\b - 0,一次或多次,最后一次0 保存在第 1 组中,后跟单词边界
      • | - 或
      • 0+(?=[1-9]) - 一个或多个 0 字符后跟一个非零数字。

    .replaceAll("(?U)\\s+", " ") 将任何 Unicode 空白字符块压缩到单个 ASCII 空间中。

    【讨论】:

      【解决方案4】:

      您可以在每个空格字符处拆分字符串,然后通过您的函数处理每个子字符串,然后再次将它们连接在一起。

      String[] substrings = myString.split(" ", 0);
      for (int i = 0; i < substring.length; i++) {
          substrings[i] = removeLeadingZeros(substrings[i]);
      }
      myString = String.Join(" ", substrings);
      

      此代码未经测试。我正在用手机写这篇文章,所以我无法完成它的步伐。希望总体思路能够通过。

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 2011-07-03
        • 2012-10-19
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多