Java:需要从字符串中提取数字

时间:2015-08-29 21:32:45

标签: java regex

我有一个包含数字的字符串。像"Incident #492 - The Title Description"这样的东西 我需要从这个字符串中提取数字 试过

Pattern p = Pattern.compile("\\d+");  
Matcher m = p.matcher(theString);  
String substring =m.group();  

收到错误

java.lang.IllegalStateException: No match found  

我做错了什么? 什么是正确的表达方式?
我很抱歉这么简单的问题,但我搜索了很多但仍未找到如何做到这一点(也许是因为它太晚了......)

3 个答案:

答案 0 :(得分:3)

您收到此异常是因为在访问find()之前需要在匹配器上调用group

Matcher m = p.matcher(theString);  
while (m.find()) {
    String substring =m.group();
    System.out.println(substring);
}

Demo.

答案 1 :(得分:1)

这里有两件事是错的:

让我们从正则表达式开始。这就是现在的样子。

Regular expression visualization

Debuggex Demo

只有 匹配包含其中所有数字的字符串。你关心的是具体该字符串中的数字,所以你想要一个表达式:

  • 不关心前面的内容
  • 不关心它之后的内容
  • 仅匹配一次出现的数字,并将其捕获到一个组中

为此,您使用此表达式:

.*?(\\d+).*

Regular expression visualization

Debuggex Demo

最后一部分是确保匹配器能够找到匹配项,并确保它获得正确的组。这完成了:

if (m.matches()) {
    String substring = m.group(1);
    System.out.println(substring);
}

现在一起:

Pattern p = Pattern.compile(".*?(\\d+).*");
final String theString = "Incident #492 -  The Title Description";
Matcher m = p.matcher(theString);
if (m.matches()) {
    String substring = m.group(1);
    System.out.println(substring);
}

答案 2 :(得分:0)

您需要调用其中一个Matcher方法,例如findmatcheslookingAt来实际运行匹配。