2013-04-28 41 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