Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归模式_Javascript_Regex_Web - Fatal编程技术网

Javascript 递归模式

Javascript 递归模式,javascript,regex,web,Javascript,Regex,Web,我想检查一个递归文本,它有三条规则 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

我想检查一个递归文本,它有三条规则

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;
模式中有什么错误?

您可以使用

/^(?!(?:\D*\d){52})(?:[12]?\d|3[01])(?:\.(?:[12]?\d|3[01]))*$/

详细信息

  • ^
    -字符串的开头
  • (?!(?:\D*\D){52})
    -如果有52个或更多的数字以任何0+非数字分隔,则失败
  • (?:[12]?\d|3[01])
    -
    1
    2
    (可选)后跟任意一位数字或
    3
    后跟
    0
    1
    0
    -
    31
  • (?:\。(?:[12]?\d|3[01])*
    -零次或多次连续重复
    • \。
      -dot
    • (?:[12]?\d|3[01])
      -见上文(
      0
      -
      31
  • $
    -字符串结束
将其与测试一起使用:

if (/^(?!(?:\D*\d){52})(?:[12]?\d|3[01])(?:\.(?:[12]?\d|3[01]))*$/.test(str)) {
    // Valid!
}
测试:

var rx=/^(?(?:\D*\D){52})(?:[12]?\D | 3[01])(?:\(?:[12]?\D | 3[01])*$;
var-strs=[“.12”、“123”、“1.23.5.12”、“12345678”];
用于(STR的var s){
控制台日志,“=>”,接收测试);

}
正则表达式
^[0-9]+\.
从字符串开始匹配
^
一个或多个数字
[0-9]+
,后跟一个点
\.

您可以使用:

解释

  • ^
    断言行的开头
  • (?!(\.?\d){52})
    负向前看,断言后面的不是一个可选点后面跟一个或多个数字的52倍
  • (?:[0-9]|[12][0-9]|[3[01])
    匹配数字0-31
  • (?:\。(?:[0-9]|[12][0-9]|[3[01])+
    在匹配一个点的一组中重复一次,然后再重复数字0-31,并重复一次或多次,以使没有点的单个数字不匹配
  • $
    断言字符串的结尾
const字符串=[
'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'
];
让模式=/^(?)(\.?\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));

});
它不会将数字限制在预期范围
0-31
,并且
numero
的内容必须以dotSo结尾,如果我将模式更改为“/^[0-31]+\./g;”,它应该可以工作吗?我开始使用模式了,这对我来说有点混乱,哈哈,这也行不通:问题解决了。感谢您的回答Andreas:)另一个变体:我尝试了这个,但是模式接受诸如“.12”(以点开头)、“123”(大于31)之类的值@Abraham请查看带有测试的代码片段。请以这种方式实现正则表达式以避免问题,即不要使用
g
修饰符,使用
RegExp\test
。好的,我没有看到测试。对不起,让我试试:)它能用Wiktor,再次谢谢你。这是你第二天帮我学习这些模式:)我终于使用了这篇文章的第一个答案。但是谢谢你的帮助:)