0

正如标题所示,我需要一个可以验证输入字符串的正则表达式,以确保它是一个介于 1-30 和最多 2 个小数位之间的数字。

例如,

4 is fine
10.25 is fine
15.3 is fine
29.99 is fine
30 is fine
30.01 is not fine

编辑:由于我使用的系统的限制,它必须是一个正则表达式,我尝试了几件事,

我能走多远

^\d{1,2}(\.\d{1,2})?$ 

它允许最多 2 位数字,最多 2 位小数。

4

3 回答 3

4

编辑:对于您需要正则表达式的具体情况,试试这个:

^(?!0)(30(\.0{1,2})?|[12]?\d(\.\d{1,2})?)$

分解:

^ ... $- 确保正则表达式在字符串的开头和结尾开始和结束。

(?!0)- 负前瞻以确保我们不以 0 开头

(30(\.0{1,2})?- 30 可选地后跟 .0 或 .00

|或者...

[12]?仅 1 或 2 的十位

\d一位非可选个位

(\.\d{1,2})?可选的 .digit 或 .digitdigit

不幸的是,这个正则表达式不容易调整以适应任何数字范围。(编写一个程序来自动吐出像这样的正则表达式将是一个有趣的项目。)


否则我会说:不要重新发明轮子。

double result;
if (double.TryParse(inputstring, out result))
{
    if (result >= 1.0 & result <= 30.0)
    {
        return true;
    }
}
return false;

如果它不是小数点后两位并且​​你需要它,你可以计算Round(result, 2)出来。

于 2013-05-03T05:03:34.500 回答
0

尽管可以编写一个正则表达式来测试上述所有条件,但我不会那样做。

我会先用正则表达式检查小数点后的位数,然后在解析字符串后将范围测试留给。

下面的这个正则表达式将允许小数点后有 0 到 2 位数字(例如1.20, 1., 1.1, 2)。注意这种情况1.- 如果您不想要这种情况,请更改{0,2}{1,2}

^\d+(\.\d{0,2})?$

请注意,.2上述正则表达式认为这是无效的,因为正则表达式确保整个部分始终包含至少 1 个数字。

验证字符串后,您可以解析数字并检查其范围,就像在 Patashu 的回答中一样。

于 2013-05-03T05:13:32.600 回答
0

那应该这样做:

^([12]?\d(\.\d{2})?|30(\.\d{2})?)$

[12]?\d(.\d{2})? - 这适用于从 1 到 29.99 或 30.00 或 30 的数字

于 2013-05-03T05:15:06.263 回答