如何在Java中使用正则表达式拆分后删除空结果?

Xel*_*ian 7 java regex

我想找到给定字符串中的所有数字(所有数字都用字母混合但是用空格分隔).我尝试拆分输入字符串但是在检查结果数组时我发现有很多空字符串,所以如何更改我的拆分正则表达式删除这个空格?

Pattern reg = Pattern.compile("\\D0*");
String[] numbers = reg.split("asd0085 sa223 9349x");
for(String s:numbers){
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

85


223
9349
Run Code Online (Sandbox Code Playgroud)

我知道我可以迭代数组并删除空结果.但是如何只用正则表达式呢?

Psh*_*emo 8

不要用split.使用find将返回所有匹配子串的方法.你可以这样做

Pattern reg = Pattern.compile("\\d+");
Matcher m = reg.matcher("asd0085 sa223 9349x");
while (m.find())
    System.out.println(m.group());
Run Code Online (Sandbox Code Playgroud)

这将打印

0085
223
9349
Run Code Online (Sandbox Code Playgroud)

根据您的正则表达式,您的目标似乎也是删除前导零,例如0085.如果这是真的,你可以使用正则表达式0*(\\d+)并参与匹配的第1组(括号中的那个)并让前导零在该组之外匹配.

Pattern reg = Pattern.compile("0*(\\d+)");
Matcher m = reg.matcher("asd0085 sa223 9349x");
while (m.find())
    System.out.println(m.group(1));
Run Code Online (Sandbox Code Playgroud)

输出:

85
223
9349
Run Code Online (Sandbox Code Playgroud)

但是如果你真的想要使用split然后更改"\\D0*",\\D+0*那么你可以拆分一个或多个非数字\\D+,而不仅仅是一个非数字\\D,但是使用这个解决方案你可能需要忽略结果数组中的第一个空元素(取决于字符串)将从应该拆分的元素开始,或者不是.


小智 8

如果你使用的是java 8,你可以在1个语句中这样做:

String[] array = Arrays.asList(s1.split("[,]")).stream().filter(str -> !str.isEmpty()).collect(Collectors.toList()).toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

  • 我只是喜欢这个oneliner是多么美丽无法辨认. (21认同)
  • 怎么样`Stream.of(s.split("")).filter(w - >!w.isEmpty()).toArray(String [] :: new);` (6认同)