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

如何在Java中使用正则表达式拆分后删除空结果?,java,regex,Java,Regex,我想查找给定字符串中的所有数字(所有数字都与字母混合,但以空格分隔)。我尝试拆分输入字符串,但在检查结果数组时发现有许多空字符串,因此如何更改拆分正则表达式以删除这些空空格 Pattern reg = Pattern.compile("\\D0*"); String[] numbers = reg.split("asd0085 sa223 9349x"); for(String s:numbers){ System.out.println(s); } 结果是: 85 223 934

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

Pattern reg = Pattern.compile("\\D0*");
String[] numbers = reg.split("asd0085 sa223 9349x");
for(String s:numbers){
    System.out.println(s);
}
结果是:

85


223
9349

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

您也可以尝试使用
模式
匹配器

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("asd0085 sa223 9349x");
while (m.find()) {
    System.out.println(m.group());
}
结果:

0085
223
9349
你可以试试这个:

reg.split("asd0085 sa223 9349x").replace("^/", "")

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

Pattern reg = Pattern.compile("\\d+");
Matcher m = reg.matcher("asd0085 sa223 9349x");
while (m.find())
    System.out.println(m.group());
哪个会打印

0085
223
9349

根据您的正则表达式,您的目标似乎也是删除前导零,如
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));
输出:

85
223
9349


但如果您确实想使用
拆分
,则将
“\\D0*”
更改为
\\D+0*
,这样您就可以在一个或多个非数字
\\D+
上拆分,而不仅仅是在一个非数字
\\D
上拆分,但使用此解决方案,您可能需要忽略结果数组中的第一个空元素(取决于字符串是否以应该拆分的元素开头)。

我认为解决此问题的方法是

String urStr = "asd0085   sa223 9349x";
urStr = urStr.replaceAll("[a-zA-Z]", "");
String[] urStrAry = urStr.split("\\s");
  • 替换字符串中的所有字母
  • 然后用空格(
    \\s
    )将其拆分
  • 使用
    String.split()
    ,当要拆分的字符串中有背对背的分隔符时,将得到一个空字符串作为数组元素

    例如,如果您在
    y
    上拆分
    xyz
    ,则第二个元素将是空字符串。为了避免这种情况,您只需在分隔符-
    y+
    中添加一个量词,以便在一次或多次迭代中拆分

    在您的情况下,之所以会出现这种情况,是因为您使用了将匹配每个非数字字符的
    \\D0*
    ,并将其拆分。因此您使用了背对背分隔符。当然,您可以在此处使用周围的量词:

    Pattern reg = Pattern.compile("(\\D0*)+");   
    
    但您真正需要的是:
    \\D+0*
    在那里


    但是,如果您只需要字符串中的数字序列,我将使用
    Matcher#find()
    方法,将
    \\d+
    作为正则表达式。

    如果您使用的是java 8,则可以在如下1条语句中完成:

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

    您想从那里获取数字字符串吗?使用番石榴,您可以执行
    Splitter.onPattern(pattern).ommiteEmptyStrings().split(string);
    Stream.of(s.split(“”).filter(w->!w.isEmpty()).toArray(string[]::new);
    String[] array = Arrays.asList(s1.split("[,]")).stream().filter(str -> !str.isEmpty()).collect(Collectors.toList()).toArray(new String[0]);