Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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_Asp.net_Regex - Fatal编程技术网

Javascript 正则表达式群划分问题

Javascript 正则表达式群划分问题,javascript,asp.net,regex,Javascript,Asp.net,Regex,我有这个问题… 我有一个必须确认的字符串,用户可以插入以正负号作为分隔符的百分比串联(最大百分比数为5): 第一个符号是可选的,因此前面的输入也应写为: 33.22+10.22+11.22+4.43+4.43 我写了这个正则表达式: ^(([+-]?\d{1,2}\.\d{1,2})|([+-]?\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3})){0,4}$ 当我收到一根火柴时,它就起作用了 问题(如图所示)是我还需要组,输入的内部部分始终被视为

我有这个问题… 我有一个必须确认的字符串,用户可以插入以正负号作为分隔符的百分比串联(最大百分比数为5):

第一个符号是可选的,因此前面的输入也应写为:

33.22+10.22+11.22+4.43+4.43
我写了这个正则表达式:

^(([+-]?\d{1,2}\.\d{1,2})|([+-]?\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3})){0,4}$
当我收到一根火柴时,它就起作用了

问题(如图所示)是我还需要组,输入的内部部分始终被视为一个组(+10.22+11.22+4.43) 我不想重复这样的原子表达式:

^(([+-]?\d{1,2}\.\d{1,2})|([+-]?\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3}))(([+-]\d{1,2}\.\d{1,2})|([+-]\d{1,3}))$
但是我想使用量词,因为我有一些页面使用了5%和6%


谢谢大家

您无法捕获p的所有迭代

在JS正则表达式中,您可以分两步进行:1)测试有效性,2)提取所有匹配项(如果有效)

if (/^(?:[+-]?(?:\d{1,2}\.\d{1,2}|\d{1,3})\b){1,5}$/.test(s)) {
    return s.match(/[+-]?\d+(?:\.\d+)?/g); 
}
详细信息

  • ^
    -字符串的开头
  • (?:[+-]?(?:\d{1,2}.\d{1,2}.\d{1,3})\b){1,5}
    -1到5次重复
    • [+-]?
      -可选的
      +
      -
    • (?:\d{1,2}\.\d{1,2}|\d{1,3})
      -一个与
      • \d{1,2}\.\d{1,2}
        -1或2位,
        和1或2位
      • |
        -或
      • \d{1,3}
        -1、2或3位数字
    • \b
      -单词边界
  • $
    -字符串结束
.match(/[+-]?\d+(?:\.\d+)/g
从验证字符串中提取
-
/
+
-1+位-可选
和1+位模式之后的所有子字符串

演示:

var s=“+33.22+10.22+11.22+4.43+4.43”;
如果(/^(?:[+-]?(?:\d{1,2}\.\d{1,2}| \d{1,3})\b){1,5}$/.test){
log(s.match(/[+-]?\d+(?:\。\d+)?/g));

}
您可以执行
regex.match(str)
在循环中,直到您耗尽输入。regex对象是有状态的,因此它可以找到您的模式,记住位置,下一次调用将找到下一个匹配项,依此类推。但我不知道这是否适用于您。您无法捕获重复捕获组的所有迭代。您可以在JS regex中分两步执行:1)测试有效性,2)提取所有匹配项(如果有效)。类似于
if(/^(?:[+-]?(?:\d{1,2}.\d{1,2}.\d{1,3})\b)*$/.test(s)){返回s.match(/[+-]?\d+)(?:\.\d+);}
为什么用
asp.net
标记?你希望得到什么答案?因为我使用的是asp.net web表单,但我使用的是javascript中的正则表达式,…也许有一些c#方法不同于javascript方法,它的工作方式不同,以不同的方式划分组是的,所以你需要一个c#解决方案,比如
Regex.Match(s,@“^([+-])(?:\d{1,2}\\d{1,2}\d{1,3}\b)*$)
?您错过了必须最大为5的部分items@Lorenzo这是这里最小的麻烦。将
*
替换为
{1,5}
。我正在边缘控制台,即控制台,regex101.com上进行测试,但它不起作用是的。。。我的fault@Lorenzo如果您想加快测试速度,可以使用jsfiddle.net或ideone.com服务与我共享。
if (/^(?:[+-]?(?:\d{1,2}\.\d{1,2}|\d{1,3})\b){1,5}$/.test(s)) {
    return s.match(/[+-]?\d+(?:\.\d+)?/g); 
}