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



我正在处理一个窗口形式,该窗口形式接受某些值范围作为输入。到目前为止,我只能找到020000之间的范围。

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

有人可以帮助我找到0.020479.0之间的范围(包括小数(?

正如评论所暗示的那样,在这些情况下,正则是理想的。不过可以做到这一点,但是变得很复杂。

^(?:(?:1?d{1,4}|20[0-3]dd|204[0-6]d|2047[0-8])(?:.d+)?|20479(?:.0+)?)$

这使用两个外部交替 - 一个与最大数字匹配,并且可以选择任何数量的零作为小数。另一个(第一个(具有几个子接头,可与不同数字的最大值匹配,并允许可选的小数点和小数。

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

在Regex101。

请参阅此处。

这是一个建议,该建议允许数字为0到20479的数字:

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

如您所见,它有点复杂,您可能不想使用正则态度。

REGEX101上的演示

说明

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

  • 1d{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}|1d{4}|20[0-4][0-7][0-8]|20479$

如果您只期望整数(最终.0(,则可以尝试此

面具是

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

如果您在末端需要.0,请在$之前添加.0。如果您需要双/十进制,则需要比精度/范围。

当您可以使用真实代码时,为什么要使用几乎无法维护的正则是:

public bool IsValid(string input = "")
{
    double inputParsed;
    if (!double.TryParse(input, out inputParsed))
        return false;
    if(inputParsed < 0 || inputParsed > 20479)
        return false;
    return true;
}

使用REGEX在点之前和之后获取两个数字。
然后检查数字以达到范围。

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);
}

最新更新