[英]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();
}
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 ) ;
所以 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.