繁体   English   中英

如何删除长字符串的前导零

[英]How to remove leading zeros with long string

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

so ow -   00250 =     00000000 ]

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

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;

但我得到的是 output

so ow -   00250 =     00000000 ]

这与原始输入相同。

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

00015039 so ow + - 003948 83

返回

15039 so ow + - 003948 83

但想回来

15039 so ow + - 3948 83

谢谢!

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

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

请原谅任何错别字。 我正在用手机写这篇文章,所以我无法完成它的步伐。 希望总体思路能够通过。

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

其中 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();
}

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( " " )

拆分结果为数组。 制作该数组的 stream 。

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

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

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

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

尝试将每个部分解析为 integer 编号。 如果解析失败,则抛出异常。 捕获该异常。 如果被捕获,只需返回我们尝试过但未能解析的文本。 如果没有异常,则返回一个新生成的int值的字符串。

.map(
    s -> {
        try{
            int x = Integer.parseInt( s ) ;
            return String.valueOf( x ) ; 
        } catch ( NumberFormatException e ) {
            return s ;  // Swallow 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 ) ;

请参阅在 IdeOne.com 上实时运行的代码

所以 ow - 250 = 0 ]

您可以使用

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

请参阅正则表达式演示

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

  • \b(?<,\d[..]) - 单词边界,右侧必须有字符串开头或非单词字符,并且不能有数字+点或逗号紧邻当前位置的左边(即我们排除十进制数字匹配)
  • (?:(0)+\b|0+(?=[1-9])) - 两种模式之一:
    • (0)+\b - 0 ,一次或多次,最后一个0保存在 Group 1 中,后跟一个单词边界
    • | - 或者
    • 0+(?=[1-9]) - 一个或多个0字符后跟一个非零数字。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM