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

How to remove leading zeros with long string

我正在尝试从 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

哪个return

15039 so ow + - 003948 83

但想return

15039 so ow + - 3948 83

谢谢!

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

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

此代码未经测试。我是从我的 phone 开始写这篇文章的,所以我无法完成它的进度。希望总体思路能够通过。

通过将给定的字符串拆分为数组然后删除前导零,效果很好。

其中 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

我会将字符串分成几部分,用 SPACE 个字符分隔。

input.split( " " )

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

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

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

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

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

尝试将每个部分解析为整数。如果解析失败,则抛出异常。陷阱那个例外。如果被捕获,只需 return 解析失败的文本。如果没有例外,return 新生成的 int 值的字符串。

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

收集所有剩余的和 newly-created 部分,并以 SPACE 作为分隔符。

.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

so ow - 250 = 0 ]

您可以使用

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

参见regex demo

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

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

.replaceAll("(?U)\s+", " ") 将任何 Unicode 白色 space 字符块缩小为单个 ASCII space.