Java String删除所有非数字字符和单词var123

时间:2014-08-26 08:55:28

标签: java string character

我有一个字符串:

String s = "12 text var2 14 8v 1";

我只需要从这个字符串中获取数字,如:

12 14 1.

但我不需要像:

这样的词
var2 and 8v.c  

我试过了:

str = str.replaceAll("[^\\d.]", "");`

5 个答案:

答案 0 :(得分:2)

如果您真的想使用String.replaceAll,那么就有了解决方法:

//            | one or more non-digits
//            |   | followed by one or more digits
//            |   |   | followed by one or more non-digits
//            |   |   |    | or the end of the input      
//            |   |   |    |     | replace with single white space
s.replaceAll("\\D+\\d+(\\D+|$)", " ");

<强>输出

12 14 1

然而,这个解决方案很难看,并且可能会因不同的输入而中断。

我建议你改为解析积极因素,然后通过迭代输入来收集。

以下内容:

//                           | word boundary
//                           |  | one or more digits
//                           |  |    | word boundary
Pattern p = Pattern.compile("\\b\\d+\\b");

答案 1 :(得分:0)

这里的关键是单词边界(\b)。这似乎有效:

String s = "x4 12 text var2 14 8v 1 1a";
s = s.replaceAll("\\b[\\d.]*[^ \\d.]+[\\d.]*\\b", "").replaceAll("  +", " ").trim();
System.out.println(s); // "12 14 1"

这样做的是在任何至少有一个非数字,非小数点,非空格的任何一侧查找单词边界,并删除整个匹配。根据您的输入,您可能需要向中间的否定字符类添加更多空格。然后我修剪了无关的空间。

答案 2 :(得分:0)

GuavaApache Common

的其他解决方案
String s = "12 text var2 14 8v 1";
Iterable<String> split = Splitter.on(CharMatcher.BREAKING_WHITESPACE).split(s);

for (String string : split) {
    boolean isNumber = StringUtils.isNumber(string);
    if(isNumber) {
        System.out.println(string);
    }
}

// Result -- 12 14 1

答案 3 :(得分:0)

您可以使用Scanner类来扫描句子中的每个单词以及传递每个单词并检查其是否为数字的方法。

static boolean isNumber(String a){
    try{
        int x = Integer.parseInt(a);  
    }catch(NumberFormatException e){  
        return false; // if it attempts to parse an int from a String like "text" etc..
    }  
    return true;  // if int was successfully parsed 
}


public static void main(String[] args){

    String s = "12 text var2 14 8v 1"; 
    Scanner in = new Scanner(s);
    String result = "";

    while(in.hasNext()){ //scan every word
        String a = in.next();
            if(isNumber(a)) //check if number
                result += a + " "; //add only if its number
    }

    result = result.substring(0, result.length() - 1);//do this to remove the last " "(space) added inside the loop
}

System.out.println(result);将打印:"12 14 1"

答案 4 :(得分:-1)

试试这个regex

([0-9]*[^0-9\s]+[0-9]*\s*)

这里所有在开头[0-9]*处有(或没有)数字的字符串后跟一个或多个非数字字符[^0-9\s]+,然后有(或没有)数字和空格{找到{1}}。 它会找到所有字符但数字。它适用于所有类型的角色 - 也是特殊角色。

以这种方式使用它会产生你需要的东西:

[0-9]*\s*

输出:

String myString = "12 text var2 14 8v 1";
myString = myString.replaceAll("([0-9]*[^0-9\\s]+[0-9]*\\s*)", "");
System.out.println(myString);