我想使用正则表达式验证以下文本
整数(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('');
}
}
}
但它不起作用
请任何人帮助我做出正确的
答案 0 :(得分:1)
我看不出你所尝试的表达方式与你给我们的描述有什么关系。你想要的是
/\d+(fs|sf)[+-]\d+[hmd]/
由于您似乎对regular expressions有点了解,我不会逐步解释: - )
如果您需要从“整数”匹配项中排除零,请改用[1-9]\d*
。不确定是否通过“(1..any)”表示数字位数或数字本身。
查看代码,
for in
enumerations on arrays _str
是否与正则表达式完全匹配(而不仅仅是某些部分)test
method而不是match
- 您不需要结果字符串,只需要它是否匹配err_pos
变量,它几乎不适用于search
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,logs)分成两个函数。
答案 1 :(得分:1)
这应该这样做:
/^[1-9]\d*(?:fs|sf)[-+][1-9]\d*[hmd]$/i
你很亲密,但你似乎缺少一些基本的正则表达式理解。
首先,^
和$
只是确保您匹配整个字符串。否则,之前或之后的任何垃圾都将被视为有效。
格式[1-9]\d*
允许从1向上(和任意长度的数字)的任何整数。
(?:fs|sf)
是一种替代方式(?:
是使群组无法捕获)以允许两种选择。
[-+]
和[hmd]
是允许匹配其中任何一个字符的字符类。
最终i
允许字母为小写或大写。
答案 2 :(得分:0)
尝试这样的事情:
/^\d+(?:fs|sf)[-+]\d+[hmd]$/i