如何在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]);