如何从特定格式的字符串中提取数字?

时间:2015-08-12 18:16:25

标签: java regex string split

我有一个像这样的字符串,如下所示。从下面的字符串我需要提取数字123,它可以在任何位置,如下所示,但字符串中只有一个数字,它将始终采用相同的格式_number_

text_data_123
text_data_123_abc_count
text_data_123_abc_pqr_count

text_tery_qwer_data_123
text_tery_qwer_data_123_count
text_tery_qwer_data_123_abc_pqr_count

以下是代码:

String value = "text_data_123_abc_count";   

// this below code will not work as index 2 is not a number in some of the above example
int textId = Integer.parseInt(value.split("_")[2]);

这样做的最佳方式是什么?

5 个答案:

答案 0 :(得分:1)

\\d+

这个带find的正则表达式应该为你做。

答案 1 :(得分:1)

使用正向前瞻断言。

Matcher m = Pattern.compile("(?<=_)\\d+(?=_)").matcher(s);
while(m.find()) 
{
System.out.println(m.group());
}

答案 2 :(得分:1)

有一点guava魔法:

String value = "text_data_123_abc_count";
Integer id = Ints.tryParse(CharMatcher.inRange('0', '9').retainFrom(value)

另见CharMatcher doc

答案 3 :(得分:1)

您可以使用replaceAll删除所有非数字,只留一个数字(因为您说输入字符串中只有1个数字):

String s = "text_data_123_abc_count".replaceAll("[^0-9]", "");

请参阅IDEONE demo

您可以使用[^0-9](也就是非数字)代替\D

String s = "text_data_123_abc_count".replaceAll("\\D", "");

鉴于当前的要求和限制,replaceAll解决方案似乎最方便(无需直接使用Matcher)。

答案 4 :(得分:0)

你可以从该字符串中获取所有部分并与其大写进行比较,如果相等则可以将其解析为数字并保存:

public class Main {

public static void main(String[] args) {

    String txt = "text_tery_qwer_data_123_abc_pqr_count";

    String[] words = txt.split("_");

    int num = 0;

    for (String t : words) {
        if(t == t.toUpperCase())
            num = Integer.parseInt(t);
    }

    System.out.println(num);
}

}