Java:正则表达式模式,忽略包含小数的任何数字

时间:2015-07-12 22:54:15

标签: java regex

我有一个字符串 match = "234 587.094";
我需要找到的,使用正则表达式,只是字符串中的每个整数 与模式匹配时,只应返回234,因为587.094不是整数。

这是我到目前为止的模式:

Pattern int_p = "(\\d+[^(\\.?\\d+)])";

3 个答案:

答案 0 :(得分:5)

你可以尝试这种模式

"\\d+(\\.\\d+)?"

它匹配整数和小数,但是当你找到小数时,你就忽略它。

public static void main(String[] args) throws Exception {
    String data = "234 587.094 123 3.4 6";
    Matcher matcher = Pattern.compile("\\d+(\\.\\d+)?").matcher(data);
    while (matcher.find()) {
        if (matcher.group(1) == null) {
            System.out.println(matcher.group());
        }
    }
}

结果:

234
123
6

更新

或者您可以使用此模式{/ 1}删除所有十进制数字

replaceAll()

然后你只剩下你可以使用模式的整数"\\d+\\.\\d+"

\\d+

结果:

public static void main(String[] args) throws Exception {
    String data = "234 587.094 123 3.4 6 99999.9999 876";

    // Remove decimal numbers
    data = data.replaceAll("\\d+\\.\\d+", "");

    Matcher matcher = Pattern.compile("\\d+").matcher(data);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

答案 1 :(得分:1)

首先使用1个或多个空格\s+拆分String并存储在字符串数组中,然后过滤掉

不包含"."的值。试试这个:

String str = "234 587.094";
String[] array = str.split("\\s+");

for(int i = 0; i < array.length; i++)
{
    if(!array[i].contains(".")){
    System.out.println(array[i]);
    }
}

答案 2 :(得分:1)

在一行中,如果找到一个,此代码将提取数字,否则提取空白:

String num = str.replaceAll(".*?(^|[^.\\d])(\\d+)?($|[^.\\d]).*$", "$2");

这是通过要求组的前后字符既不是点也不是数字(并覆盖输入开始/结束的边缘情况)来实现的。

如果通过将?添加到捕获的组来实现不匹配,则返回空白的添加特殊酱,允许它不存在(因此不捕获任何内容),但允许整个表达式仍然匹配整个输入,因此什么也没有回来。

这是一些测试代码:

for (String str : new String[] {"234 587.094", "234",  "xxx", "foo 587.094"})
    System.out.println(str.replaceAll(".*?(^|[^.\\d])(\\d+)?($|[^.\\d]).*$", "$2"));

输出:

234
234
<blank>
<blank>