2011-08-12 48 views
1

類內部我有一個模式private Pattern lossWer = Pattern.compile("^\\d+ \\d+ (\\d+).*")。其中一個功能如下所示:Java正則表達式僅在匹配檢查時匹配

public double[] getWer(){ 
    double[] wer = new double[someStrings.size()]; 
    Matcher m; 
    for(int i = 0; i < wer.length; i++){ 
     m = lossWer.matcher(someStrings.get(i)); 
     wer[i] = Double.parseDouble(m.group(1)); 
    } 
    return wer; 
} 

調用此操作失敗,返回java.lang.IllegalStateException: No match found。當我將其更改爲這一點,雖然,它的工作原理:

public double[] getWer(){ 
    double[] wer = new double[someStrings.size()]; 
    Matcher m; 
    for(int i = 0; i < wer.length; i++){ 
     m = lossWer.matcher(someStrings.get(i)); 
     if(!m.matches()) 
      ; 
     wer[i] = Double.parseDouble(m.group(1)); 
    } 
    return wer; 
} 

當然,我的應用程序不只是使用空白分號該行,但我說明的是,這裏行什麼也不做,但允許該程序無誤地繼續。爲什麼在第二個例子中行匹配沒有錯誤,但在第一個例子中沒有錯誤?

回答

4

如果未先致電find()matches(),則不能使用group()。這就是正則表達式的工作原理。首先你創建一個模式,然後是一個匹配器,然後你找到()正則表達式的實例或檢查它是否匹配()。

3

檢查this爲IllegalStateException異常

匹配器的顯式狀態最初是未定義的;在成功匹配之前嘗試 查詢它的任何部分都會導致引發IllegalStateException 。匹配器的顯式狀態是每個匹配操作重新計算的 。

這與瑞安的答案相結合應該給你你需要的東西。

1

直到你打電話給m.matches()你還沒有測試正則表達式,所以沒有組。

你說在那一行,測試正則表達式。如果沒有比賽什麼都不做,那麼你繼續檢查比賽的小組(1)(並且因爲它與它工作的小組匹配)。

這將是最好的改變:

if(!m.matches()) 
     ; 
    wer[i] = Double.parseDouble(m.group(1)); 

要:

if(m.matches()) 
     wer[i] = Double.parseDouble(m.group(1)); 

或者使用!m.matches()返回一個錯誤或東西。您的選擇:)