2013-04-28 60 views
0

我試圖確定變量degreeOfDifficulty是否爲「1.2」和「4.8」(含)之間的數值,並且不接受字符值。所以「1.0」,「4.9」,「a」和「!」無效; 「1.2」,「4.8」,「4.0」和「4」是有效的。到目前爲止,我有:Java - 正則表達式有效條目

degreeOfDiffString.matches("^[1](\\.[2-9]?)?|^[2-3](\\.[0-9]?)?|[4](\\.[0-8]?)?")) 

有沒有我丟失的東西,如果我輸入一個字符會導致錯誤拋出?

回答

2

你不需要這個正則表達式。只需使用Double.parseDouble()解析您的degreeOfDiffString,然後檢查double是否在1.2和4.8之間(包括)。

例(未經測試,只是我現在打完了):「」

try 
{ 
    String degreeOfDiffString = "3.4"; 
    double number = Double.parseDouble(degreeOfDiffString); 
    if (number < 1.2 || number > 4.8) System.out.println("Invalid difficulty."); 
    else 
    { 
     // Do stuff 
    } 
} catch (Exception e) 
{ 
    // Handle exception 
} 

如果在字符串隨機的東西,如或一些字母,那麼應該拋出一個NumberFormatException,你可以處理。

+1

@downvoter護理解釋?使用「[1]」或「1」的 – syb0rg 2013-04-28 22:39:27

3

避免使用正則表達式時不要使用正則表達式。您實際上可以解析degreeOfDiffString並獲取數值(如果它是數字),然後檢查上限和下限(1.2到4.8)。更容易編碼和理解正在發生的事情。正則表達式使你的代碼錯誤容易發生,如果你決定稍後改變界限,你必須重新工作你的正則表達式。

try 
{ 
    double d = Double.parseDouble(degreeOfDiffString); 
    if(d >= 1.2 && d <= 4.8) 
    { 
     return true; // valid 
    } 
} 
catch(NumberFormatException ex) 
{ 
} 
return false; // all other cases -> invalid 
0

該模式並不正確。

其中一個謬誤是,如果您確實是指14,則分別使用[1]和。

您必須在模式開始時只放置一個^;其他插文不正確。此外,Java matches()方法將整個模式與主題匹配,所以插入符號是多餘的。

您將小數點匹配的方式表達爲短語,它將接受第一個數字之後的一個空白時間段以及一個數字之後的一個句點。這是你想要的嗎?

+2

完全相同。括號是多餘的,但不會造成任何傷害。額外的分號也沒有問題,因爲'|'的優先級最低,所以最初的^ ^不適用於第二個和第三個選擇(實際上,第三個選擇中甚至沒有插入符號)。當然你是對的,如果你說'匹配'無論如何都隱含地使用它們。 – 2013-04-28 22:42:28

0

嘗試用這種模式符合公認的數字是:

1\\.[2-9]|[23](\\.\\d)?|4(\\.[0-7])?|4\\.8