从字符串中提取数字

时间:2014-02-17 11:57:06

标签: java regex

我有一个java String对象。

让我们说

String str = "5N7BS is having a number 33 and 55c";

所需的输出:33 55

    Pattern p = Pattern.compile("[0-9]+");
    Matcher m = p.matcher("5N7BS is having a number 33 and 55");
    while (m.find()) {
        System.out.println(m.group());
    }

上面的代码给出5 7 33 55作为输出。 我只想要输出数字后跟字母表的输出 例如:55c输出: - 55
但对于55c5或cc5,我不想要任何结果
在此先感谢: - )

5 个答案:

答案 0 :(得分:2)

你的问题不清楚,但这似乎符合你的要求:

str = str.replaceAll(".*?(\\b(\\d+)[a-z]*\\b|$)", " $2").trim();

这是一些测试代码:

String str = "5N7BS is having a number 33 and 55c2 xyz";
str = str.replaceAll(".*?(\\b(\\d+)[a-z]*\\b|$)", " $2").trim();
System.out.println(str);

输出:

33

答案 1 :(得分:2)

您可以使用字边界(\\b)来添加所需的约束。这只会匹配数字,如果它紧跟在边界之后,并且在下一个单词边界之前后面只有字母(如果有的话)。 请注意,它使用专用组来捕获数字:

Pattern p = Pattern.compile("\\b([0-9]+)[a-zA-Z]*\\b");
Matcher m = p.matcher("5N7BS is having a number 33 and 55c");
while (m.find()) {
    System.out.println(m.group(1));
}

答案 2 :(得分:0)

这也有效,一个或多个数字出现,但没有任何字母。

Pattern p = Pattern.compile("([0-9]+[^a-zA-Z])+");

答案 3 :(得分:0)

这也有效: - )

package com.test;

import java.util.LinkedList;
import java.util.List;

public class NumbersFollowedByAlphabet {
    public static void main(String[] args) {
        String s = "5N7BS is having a number 33 and 55c";
        char [] ch = s.toCharArray();
        int consecutive = 0;
        List<String> list = new LinkedList<String>();
        String consecutiveNumber = "";
        for(char c : ch) {
            if(Character.isDigit(c)) {
                consecutive++;
                consecutiveNumber += c;
            } else if(c == ' ' || Character.isLetter(c)) {
                if(consecutive >= 2 && c != ' ') {
                    list.add(consecutiveNumber);
                }
                consecutive = 0;
                consecutiveNumber = "";
            }
        }
        System.out.println(list);
    }
}

答案 4 :(得分:0)

您甚至可以使用较短的版本:

Pattern p = Pattern.compile("[0-9]+[^\\D]");