1

我想使用正则表达式验证以下文本

integer(1..any)/'fs' 或 'sf'/ + 或 - /integer(1..any)/(h) 或 (m) 或 (d)

样品:

1) 8fs+60h
2) 10sf-30m
3) 2fs+3h
3) 15sf-20m

我试过这个

function checkRegx(str,id){
    var arr = strSplit(str);
    var regx_FS =/\wFS\w|\d{0,9}\d[hmd]/gi;

    for (var i in arr){
            var str_ = arr[i];
            console.log(str_);
            var is_ok = str_.match(regx_FS);
            var err_pos = str_.search(regx_FS);                
            if(is_ok){
              console.log(' ID from ok ' + id);
              $('#'+id).text('Format Error');
              break;
            }else{
              console.log(' ID from fail ' + id);
              $('#'+id).text('');
            } 
     }  
 }            

但它不工作

请任何人都可以帮我改正

4

3 回答 3

1

我看不出你尝试的表达方式与你给我们的描述有什么关系。你想要的是

/\d+(fs|sf)[+-]\d+[hmd]/

由于您似乎对正则表达式有所了解,因此我不会逐步解释:-)

如果您需要从“整数”匹配中排除零,请[1-9]\d*改用。不确定“ (1..any) ”是指位数还是数字本身。

看代码,你

function checkRegx(str, id) {
    var arr = strSplit(str);
    var regx_FS = /^\d+(fs|sf)[+-]\d+[hmd]$/i;

    for (var i=0; i<arr.length; i++) {
        var str = arr[i];
        console.log(str);
        if (regx_FS.test(str) {
            console.log(' ID from ok ' + id);
            $('#'+id).text('Format Error');
            break;
        } else {
            console.log(' ID from fail ' + id);
            $('#'+id).text('');
        } 
    }  
}

顺便说一句,最好将验证(正则表达式、数组拆分、迭代)与输出(id、jQuery、日志)分成两个函数。

于 2013-09-11T13:34:30.593 回答
1

这应该这样做:

/^[1-9]\d*(?:fs|sf)[-+][1-9]\d*[hmd]$/i

你很接近,但你似乎缺少一些基本的正则表达式理解。

首先,^and$只需确保您匹配整个字符串。否则之前或之后的任何垃圾都将被视为有效。

该格式[1-9]\d*允许从 1 向上的任何整数(以及任意位数的长度)。

(?:fs|sf)是一个交替(?:使组不捕获)以允许两个选项。

[-+]并且[hmd]是允许匹配其中任何一个字符的字符类。

最后i允许字母为小写或大写。

于 2013-09-11T13:34:43.373 回答
0

尝试这样的事情:

/^\d+(?:fs|sf)[-+]\d+[hmd]$/i
于 2013-09-11T13:33:23.050 回答