0

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

  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. 浮点值不需要负数

我试图生成一些正则表达式,但最接近的是:

(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但不比较左右部分的值。并且只有一个数字的值也不会被验证。

4

2 回答 2

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));
}
于 2013-11-12T08:06:39.083 回答
0

另一个带有正则表达式的变体函数用于解决方案

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)))}
于 2013-11-12T10:30:19.333 回答