2013-10-19 111 views
1

所以我有一个功能,看起来像这样:模式匹配的烦恼

private int getNumber(String commandChunk) 
    { 
     Pattern pattern = Pattern.compile("R(\\d+)"); 
     Matcher m = pattern.matcher(commandChunk); 
     return Integer.parseInt(m.group(1)); 
    } 

这是越来越称为有“R0”。我希望它返回int:0,但是我在return语句中得到了非法状态异常。我究竟做错了什么?我不知道为什么我不能说int myNum = getNumber("R0")结果与myNum = 0

+1

对于FSM的爱,使模式的常数。为什么每次调用方法时重新编译它? –

+0

会做,谢谢。 –

回答

5

group将抛出IllegalStateException(如果没有之前matchesfind)。调用调用group使得表达相匹配的完整的Stringmatches之前:

class NumberTest { 
    final static Pattern pattern = Pattern.compile("R(\\d+)"); 

    public static void main(String[] args) { 
     System.out.println(new NumberTest().getNumber("R0")); 
    } 

    private int getNumber(String commandChunk) { 
     Matcher m = pattern.matcher(commandChunk); 
     if (m.matches()) { 
      return Integer.parseInt(m.group(1)); 
     } else { 
      return -1; 
     } 
    } 
} 
+0

引用javadoc,_“匹配器的显式状态最初是未定义的;在匹配成功之前试图查询匹配器的任何部分都会导致IllegalStateException异常,每次匹配操作都会重新计算匹配器的显式状态。 “_ –

+0

但是我的正则表达式呢?为什么它不匹配一个组? –

+0

因为你没有调用'matches'(或'find'),所以它在表达式匹配之前抛出'IllegalStateException'。看演示添加 – Reimeus