用连字符分隔的浮动范围的正则表达式(年和月)

时间:2013-11-12 07:17:46

标签: javascript regex validation

我需要验证包含范围的文本框字段(由-分隔)。以下是要求:

  1. 需要验证年份和年份月份范围,并且0.5 - 3.11的值用于表示5 months to 3 years and 11 months
  2. 小数位数可以是最大2位数,11位小数位是最大值,0是最小值。
  3. 用连字符-分隔的两个部分可能包含也可能不包含1个空格(仅在连字符之前和之后)。
  4. 左侧部分必须始终小于右侧部分。
  5. 应验证以下值:
    • 1
    • 2.3
    • 2.3 - 4.6
    • 2.3-4.6
    • 2.4-2.1无效
  6. 浮动值不需要否定
  7. 我试图生成一些正则表达式,但最接近的是:

    (0|([1-9][0-9]{0,9}))(\.[0-9]{1,2})?(-)(0|([1-9][0-9]{0,9}))(\.[0-9]{1,2})? 
    

    但它只能验证1.3-1.9之类的值,但不会比较左右部分。并且只有一个数字值也未经过验证。

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式执行大部分验证,但是检查第一个值是否小于第二个值必须在代码而不是正则表达式中完成。

function isRangeStringValid(r) {
    if (!r.match(/(0|[1-9]\d*)\.(\d|1[01]) ?- ?(0|[1-9]\d*)\.(\d|1[01])/)) {
        return false;
    }
    var y1 = parseInt(RegExp.$1);
    var m1 = parseInt(RegExp.$2);    
    var y2 = parseInt(RegExp.$3);    
    var m2 = parseInt(RegExp.$4);
    return (y1<y2 || (y1==y2 && m1<m2));
}

答案 1 :(得分:0)

另一个带有regexp for solution的变体函数

function israngev(r){
    var res = r.match(/^\d+$|^\d+\.(\d|1[01])$|^(\d+\.(\d|1[01])) ?- ?(\d+\.(\d|1[01]))$/);
    return res!=null && 
          (!(res[1]||res[2]||res[4]) || 
            (res[1]!=null            ||
            (res[4]-res[2]>0)))}