我要检查一个符合三个规则的递归文本。
1º:所有字符串应为介于0-31 +点之间的数字序列。
示例:1.23.5.12
2º:字符串不能以点开头或结尾。 像这样。 .1.23.5.12。
3º(最多可以输入51个数字)(遵循以前的规则)
我试图为我的js函数建立模式。但这不起作用。
这是我的功能:
var str = document.getElementById("numero").value;
var patt1 = /^[0-9]+\./g;
var result = str.match(patt1);
document.getElementById("demo").innerHTML = result;
模式有什么问题?
答案 0 :(得分:2)
您可以使用
/^(?!(?:\D*\d){52})(?:[12]?\d|3[01])(?:\.(?:[12]?\d|3[01]))*$/
请参见regex demo
详细信息
^
-字符串的开头(?!(?:\D*\d){52})
-如果有52个或更多数字与任意0+个非数字分开,则失败(?:[12]?\d|3[01])
-1
或2
(可选),后跟任意一位数字或3
,后跟0
或1
({{ 1}}-0
)31
-的零次或更多次连续重复
(?:\.(?:[12]?\d|3[01]))*
-点\.
-参见上文({{11}-(?:[12]?\d|3[01])
)0
-字符串的结尾。与31
一起使用:
$
测试:
test
答案 1 :(得分:2)
正则表达式^[0-9]+\.
从字符串^
的开头开始匹配一个或多个数字[0-9]+
,后跟点\.
您可以使用:
^(?!(\.?\d){52})(?:[0-9]|[12][0-9]|3[01])(?:\.(?:[0-9]|[12][0-9]|3[01]))+$
说明
^
断言行的开头(?!(\.?\d){52})
否定性地断言以下内容不是可选点后跟一个或多个数字的52倍(?:[0-9]|[12][0-9]|3[01])
匹配数字0-31 (?:\.(?:[0-9]|[12][0-9]|3[01]))+
在与点相匹配的组中重复,后跟数字0-31,并重复一次或多次,以使没有点的单个数字不匹配$
声明字符串的结尾
const strings = [
'1.23.5.12',
'1.23.5.12.',
'.1.23.5.12.',
'1.23.5.12',
'1',
'1.23.5.12.1.23.5.1.23.5.12.1.23.5.1.23.5.12.1.23.5.1.23.5.12.1.23.5.1.23.5.12.1.23.5.2',
'1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12.1.23.5.12'
];
let pattern = /^(?!(\.?\d){52})(?:[0-9]|[12][0-9]|3[01])(?:\.(?:[0-9]|[12][0-9]|3[01]))+$/;
strings.forEach((s) => {
console.log(s + " ==> " + pattern.test(s));
});