C# 用于检查数字范围(带小数)的正则表达式

C# 用于检查数字范围(带小数)的正则表达式,c#,regex,numbers,C#,Regex,Numbers,我正在开发一个窗口窗体,它接受一定范围的值作为输入。到目前为止,我只能找到0和20000之间的范围 (20000|[0-9]|0[1-9]|[1-9]\d{0,3})$ 有人能帮我找到0.0和20479.0(包括小数)之间的范围吗?如果你只需要整数(.0结尾),你可以试试 面具是 ^((1?[0-9]{0,4})|((20(([0-3][0-9]{0,2})|(4[0-7][0-9])))))$ 如果您需要.0结尾,请在$之前添加\.0。如果需要双精度/小数,则需要精度/范围。如评论所示,在

我正在开发一个窗口窗体,它接受一定范围的值作为输入。到目前为止,我只能找到
0
20000
之间的范围

(20000|[0-9]|0[1-9]|[1-9]\d{0,3})$

有人能帮我找到
0.0
20479.0
(包括小数)之间的范围吗?

如果你只需要整数(.0结尾),你可以试试

面具是

^((1?[0-9]{0,4})|((20(([0-3][0-9]{0,2})|(4[0-7][0-9])))))$

如果您需要.0结尾,请在
$
之前添加
\.0
。如果需要双精度/小数,则需要精度/范围。

如评论所示,在这些情况下,正则表达式远远不够理想。虽然可以这样做,但会变得相当复杂

^(?:(?:1?\d{1,4}|20[0-3]\d\d|204[0-6]\d|2047[0-8])(?:\.\d+)?|20479(?:\.0+)?)$
这需要使用两个外部替换-一个匹配最大数字,另一个可选地匹配任意数量的零作为小数。另一个(第一个)具有多个子替换,与不同数字的最大值匹配,并允许可选的小数点和小数

1?\d{1,4}     Matches 0-19999
20[0-3]\d\d   Matches 20000-20399
204[0-6]\d    Matches 20400-20469
2047[0-8]     Matches 20470-20478

.

这里有一个建议,允许0到20479之间的数字使用小数:

^(0?[0-9]{0,4}(?:\.\d+)?|1\d{4}(?:\.\d+)?|20[0-4][0-7][0-8](?:\.\d+)?|20479(?:\.[0-7])?)$
正如您所看到的,它有点复杂,您可能不想使用正则表达式来完成它

解释

  • (0?[0-9]{0,4}(?:\.\d+)
    介于0.0和9999.99之间(小数是可选的)

  • 1\d{4}(?:\.\d+)
    介于10000.0和19999.99之间(小数是可选的)

  • 20[0-4][0-7][0-8](?:\。\d+)
    介于20000.0和2048.99之间(小数是可选的)

  • 20479(?:\[0-7])?
    介于20479和20479.7之间


更新:不带小数,您可以使用:

^(0?[0-9]{0,4}|1\d{4}|20[0-4][0-7][0-8]|20479$

当您可以使用真实代码时,为什么要使用难以维护的正则表达式:

public bool IsValid(string input = "")
{
    double inputParsed;
    if (!double.TryParse(input, out inputParsed))
        return false;

    if(inputParsed < 0 || inputParsed > 20479)
        return false;

    return true;
}
public bool有效(字符串输入=”)
{
双输入解析;
如果(!double.TryParse(输入、输出解析))
返回false;
如果(inputParsed<0 | | inputParsed>20479)
返回false;
返回true;
}

使用正则表达式在点之前和之后获得两个数字。
然后检查数字以达到范围

var list = new List<string> { "VB0.0", "VB20479.0", "VB20479.7", "VB20480.0", "VB010000.0", "VB0.8", "VBx.y" };

string pattern = @"(\d+)\.(\d+)";

foreach (var input in list)
{
    var m = Regex.Match(input, pattern);

    if (m.Success)
    {
        string value1 = m.Groups[1].Value;
        string value2 = m.Groups[2].Value;

        bool result = value1.Length <= 5 && int.Parse(value1) <= 20479
                   && value2.Length <= 1 && int.Parse(value2) <= 7;

        Console.WriteLine(result);
    }
    else Console.WriteLine(false);
}
var list=新列表{“VB0.0”、“VB20479.0”、“VB20479.7”、“VB20480.0”、“VB010000.0”、“VB0.8”、“VBx.y”};
字符串模式=@“(\d+)\(\d+);
foreach(列表中的var输入)
{
var m=Regex.Match(输入,模式);
如果(m.成功)
{
字符串值1=m.Groups[1]。值;
字符串值2=m.Groups[2]。值;

bool result=value1.Length您尝试过做什么?(为什么需要正则表达式?)做一个简单的比较-一个常量或可配置的数值比模糊的、专门的正则表达式更容易维护。这将变成:是的,正则表达式可能不是您的首选,并且会使problem@dlatikay我的输入中也有一些字符,如VB0.0-VB20479.0,因此数字可以以arbia开头ry字符?和-您希望正则表达式匹配一个范围吗,即“number hyphen number”?
1?\d{1,4}
匹配偶数…:-)@xanatos在python中,正则表达式似乎是正确的,但在这里不是这样。(我要提醒您,如果您要通知所有文章作者这一事实,您必须在这里留下所有注释;))对.NET来说也是如此(对C#来说也是如此)…我的人生使命就是一次只告诉一个程序员:-)@xanatos:O谢谢你提供的信息。我不知道。(这对所有误将德凡加数字与阿拉伯语混合的人来说都会很有帮助;))我真的很抱歉,但是我希望范围是从0.0-0.7到20479.0-20479.7,这意味着我不希望范围超过以上。小数点处的7例如-1.7-20479.7非常感谢它工作得很好。而且你可以帮助我,而不需要相同范围的小数。@朋克,很高兴我帮了你。如果它解决了你的问题,你能接受答案吗?(答案左边分数下的标记)。我还更新了我的答案,为您提供了另一个不带小数的正则表达式。哦,我真的很抱歉我忘记了…向上投票!!!而且您也可以帮助我不带相同范围的小数。除了性能比我答案中的那个差;)它还匹配空行。这是故意的吗?