【问题标题】:Validate a string using regular expressions - 1-30 with up to 2 decimal places使用正则表达式验证字符串 - 1-30,最多 2 位小数
【发布时间】:2013-05-03 04:59:04
【问题描述】:

正如标题所示,我需要一个可以验证输入字符串的正则表达式,以确保它是一个介于 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 位小数。

【问题讨论】:

  • 那么你有什么尝试?还是你来这里只是为了给我们一个任务?
  • 问题标题为 1-30,正文为 0-30。哪个是正确的?
  • 我把body改成1-30了,不好意思
  • @Coesy 我已将答案更改为包含正则表达式。我在regexpal.com 对其进行了测试,它适用于我能想到的一切。

标签: c# regex validation


【解决方案1】:

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

^(?!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),这样就可以了。

【讨论】:

  • 这取决于。他想拒绝1.334234可能有一些原因。
  • @Simon Whitehead 哎呀,现已修复
  • @nhahtdh 我的意见是,“请编辑您的号码以保留两位小数。”不如“我已为您将您的数字四舍五入到小数点后两位。”
  • @Patashu:这取决于。您不希望对银行应用程序进行零星的四舍五入。
  • @Patashu 非常感谢编辑,但是当我尝试这个时,如果我输入 31,它会给我 2 个匹配项(3 和 1),不应该返回一个不匹配项在这里?
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 不幸的是,由于继承对象的限制,我可以验证输入的唯一方法是通过一个正则表达式。
  • @Coesy:虽然我理解你的情况,但我还是会说这是个坏主意。编写一个过度匹配的正则表达式是很常见的(匹配的东西比它应该匹配的多)。
  • 我完全同意你的看法,但在这种情况下,我别无选择,它必须是正则表达式。
【解决方案3】:

应该这样做:

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

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

【讨论】:

  • 刚试过这个,不幸的是它似乎接受30以上的整数和1以下的小数。
  • 抱歉,您的正则表达式匹配 31。
  • 错了。它将匹配30.00.00.00
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多