使用正则表达式javaScript验证文本字段

时间:2017-09-11 11:39:10

标签: javascript regex

我想验证文本字段只接受这样的文字:

  • 1,2; 2,3; 1-3
  • 1-2; 4; 2,3; 4; 1-3
  • 12

我不想要这样的类型:

  • 1
  • 下,1
  • -1
  • 1 ;; 2
  • 1,,2
  • 1--2
  • 1-2-3
  • 1,2,3
  • 1,2-3

所以我做了这个正则表达式,但似乎并没有像我想要的那样工作

var reg = /^\d*(((?!.*--)(?!.*,,)(?!.*;;)(?!.*,;)(?!.*,-)(?!.*-;)(?!.*-,)(?!.*;,)(?!.*;-))[,-;])*\d$/

感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

您可以使用

/^\d+(?:(?:[-,;]\d+){3,})?$/

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • \d+ - 一位或多位
  • (?:(?:[-,;]\d+){3,})? - 1或0个序列:
    • (?:[-,;]\d+){3,} - 3个序列:
      • [-,;] - -,;
      • \d+ - 一位或多位
  • $ - 字符串结尾

&#13;
&#13;
var ss = [ '1,2;2,3;1-3','1-2;4;2,3;4;1-3','12',';1',',1','-1','1;;2','1,,2','1--2','1-2-3','1,2,3','1,2-3',';1',',1','-1','1;;2','1,,2','1--2' ];
var rx = /^\d+(?:(?:[-,;]\d+){3,})?$/;
for (var s of ss) {
  console.log(s, "=>", rx.test(s));
}
&#13;
&#13;
&#13;

注意:[,-;]创建了,;之间的范围,其匹配程度远远超过,-;(见demo)。

答案 1 :(得分:1)

你可以简单地使用正则表达式

function match(str){
    return str.match(/^(?!.*([-,])\d+\1)(?!.*,\d+-)\d+(?:[-,;]\d+)*$/) != null
}

console.log(match(';1'));
console.log(match(',1'));
console.log(match('1;;2'));
console.log(match('1-3'));
console.log(match('12'));
console.log(match('1,2;2,3;1-3'));
console.log(match('1-2;4;2,3;4;1-3'));
console.log(match('1,2,3'));

看看regex demo

答案 2 :(得分:1)

这是我的尝试。根据您的示例,我假设分号用于分隔&#39;范围&#39;其中&#39;范围&#39;可以是由逗号或连字符分隔的单个数字或一对。

&#13;
&#13;
var re = /^\d+([,\-]\d+)?(;\d+([,\-]\d+)?)*$/;

// Test cases
[
    '1',
    '1,2',
    '1-2',
    '1;2',
    '1,2;2,3;1-3',
    '1-2;4;2,3;4;1-3',
    '12',

    ';1',
    ',1',
    '-1',
    '1;;2',
    '1,,2',
    '1--2',
    '1-2-3',
    '1,2,3',
    '1,2-3'
].forEach(function(str) {
    console.log(re.test(str));
});
&#13;
&#13;
&#13;

第一部分\d+([,\-]\d+)?匹配&#39;范围&#39;第二部分(;\d+([,\-]\d+)?)*允许进一步的范围&#39;要添加,每个都以分号开头。

如果您愿意,可以添加?:以使群组无法捕获。这可能是一个好主意,但我想尽可能简单地保持我的榜样,所以我把它们抛弃了。