【问题标题】:regex positive negative decimal numbers, comma separated正则表达式正负十进制数,逗号分隔
【发布时间】:2016-03-23 01:18:18
【问题描述】:

我无法让正则表达式正确地进行验证。需要多个小数、正数、负数和逗号分隔才能被允许,其他都没有。

应该允许:

41.975481,-87.728222, 41.974141,-87.721569, 41.973247,-87.7135

不应允许:

41.975481,-87.728222, 41.97TEST4141,-87.721569, 41.973247,-87.7135, 测试

这是我正在使用的,但它允许字符。

(\-?\d+(\.\d+))(,\s*(\-?\d+(\.\d+)))*

我错过了什么吗?

$('textarea[name="latlong"]').bind('focusout',function(){
        $(".polygon .geoerror").text("");
        var polygon = $(this).val();
        //remove trailing comma and extra space if its there
        polygon = polygon.replace(/,\s*$/, "");
        var checkpoly = /(\-?\d+(\.\d+))(,\s*(\-?\d+(\.\d+)))*/;
        var evenodd = polygon.split(',').length;

        if (checkpoly.test(polygon) && evenodd % 2 == 0) {
            $(".polygon .geoerror").text("Polygon string is valid." + polygon);
            $(".polygon .geoerror").css("color", "green");
        } else if (checkpoly.test(polygon) && evenodd % 2) {
            $(".polygon .geoerror").text("Mismatch of lat and long values." + polygon);
            $(".polygon .geoerror").css("color", "red");
        } else {
            $(".polygon .geoerror").text("Not valid." + polygon);
            $(".polygon .geoerror").css("color", "red");
        }
        return false;
    });

基于代码,如果用户输入 - 41.975481,-87.728222, 41.974141,-87.721569, 41.973247,-87.7135, test - 那么它测试为有效。它需要出错。

【问题讨论】:

    标签: javascript jquery regex forms validation


    【解决方案1】:
    $('textarea[name="latlong"]').bind('focusout',function(){
        $(".polygon .geoerror").text("");
        var polygon = $(this).val();
    
    
        //remove extra space if its there
        polygon = polygon.replace(/\s*/g, "");
    
        var nums = polygon.split(',');
        var len = nums.length;
        var is_even = ( len % 2 == 0 );
    
        if (!is_even) {
            $(".polygon .geoerror").text("Mismatch of lat and long values." + polygon);
            $(".polygon .geoerror").css("color", "red");
    
            return false;
        }
    
        var validNums = true;
    
        for(var i = 0; i < len; i++) {
            if(isNaN(nums[i])) {
                validNums = false;
                break;
            }
        }
    
        if (validNums) {
            $(".polygon .geoerror").text("Polygon string is valid." + polygon);
            $(".polygon .geoerror").css("color", "green");
        } else {
            $(".polygon .geoerror").text("Not valid." + polygon);
            $(".polygon .geoerror").css("color", "red");
        }
    
        return false;
    });
    

    【讨论】:

    • 完美!这很棒!谢谢。
    【解决方案2】:

    应该这样做:

    /^(?:\-?\d+\.\d+[, ]*)+$/
    

    https://regex101.com/r/nP9lE8/1

    【讨论】:

      【解决方案3】:

      您的正则表达式的核心绝对没问题。在caeththe answer 中给出了您遗漏的要点,但没有解释。

      基本上,他在开头添加^,在结尾添加$,强制正则表达式匹配整个单词,而不仅仅是部分单词。根据RegExr上的描述(参考->锚点)^

      [m] 匹配字符串的开头,如果启用了多行标志 (m),则匹配行的开头。这匹配一个位置,而不是一个字符。

      类似$(同一来源)

      [m] 匹配字符串的结尾,如果启用了多行标志 (m),则匹配行的结尾。这匹配一个位置,而不是一个字符。

      因此,您的正则表达式的更正(并且更简洁)版本将类似于

      /^(-?\d+\.\d+)(\s*,\s*-?\d+\.\d+)+$/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多