Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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 - Fatal编程技术网

Javascript 我的简单正则表达式没有';行不通

Javascript 我的简单正则表达式没有';行不通,javascript,regex,Javascript,Regex,我有一个简单的正则表达式,它应该匹配任何数字和“+”符号 /^[\d\+]+$/g 它的作用是: 1 => true 11 => false 11+11 => true 1+1 => false 它快把我逼疯了 (如果有必要的话,我正在使用JavaScript)我在复制错误时做了一些假设: 您使用的是RegExp-prototype的test()-方法,而不是String-prototype的match()-方法 您的模式存储在一个变量中,您可以通过多次调用test

我有一个简单的正则表达式,它应该匹配任何数字和“+”符号

/^[\d\+]+$/g
它的作用是:

1  => true
11 => false
11+11 => true
1+1 => false
它快把我逼疯了


(如果有必要的话,我正在使用JavaScript)

我在复制错误时做了一些假设:

  • 您使用的是
    RegExp
    -prototype的
    test()
    -方法,而不是
    String
    -prototype的
    match()
    -方法
  • 您的模式存储在一个变量中,您可以通过多次调用
    test()
    -方法重用它
  • 乍一看,结果有些出乎意料,但我将尝试解释发生了什么

    您的RegExp的全局标志设置为true。这会导致对
    test()
    -方法的后续调用超过前面的匹配,如上所述。这本质上意味着,在计算第一个正则表达式并找到匹配项后,此匹配项的索引将存储到
    RegExp
    -对象中,下一个匹配项将从该索引开始,在开始处省略一些字符。要想得到更深入的解释,我建议阅读

    这不是你真正想要的,对吧?我的快速建议是简单地删除全局标志,因为从我的观点来看,您并不真正需要它。如果要确保正则表达式只匹配完整字符串而不是子字符串,请使用
    ^
    $
    元字符(正如您已经做的那样)


    编辑:

    但是,如果您确实需要全局标志,请尝试使用
    字符串
    -prototype的
    match()
    -方法,因为它不会超过以前的匹配。相反,它使用推进功能并捕获所有匹配项,然后重置索引

    var pattern = /^[\d\+]+$/g;
    "1".match(pattern); // => true
    "11+11".match(pattern); // => true
    "1+1abc".match(pattern); // => false
    

    我在再现您的错误时所做的一些假设:

  • 您使用的是
    RegExp
    -prototype的
    test()
    -方法,而不是
    String
    -prototype的
    match()
    -方法
  • 您的模式存储在一个变量中,您可以通过多次调用
    test()
    -方法重用它
  • 乍一看,结果有些出乎意料,但我将尝试解释发生了什么

    您的RegExp的全局标志设置为true。这会导致对
    test()
    -方法的后续调用超过前面的匹配,如上所述。这本质上意味着,在计算第一个正则表达式并找到匹配项后,此匹配项的索引将存储到
    RegExp
    -对象中,下一个匹配项将从该索引开始,在开始处省略一些字符。要想得到更深入的解释,我建议阅读

    这不是你真正想要的,对吧?我的快速建议是简单地删除全局标志,因为从我的观点来看,您并不真正需要它。如果要确保正则表达式只匹配完整字符串而不是子字符串,请使用
    ^
    $
    元字符(正如您已经做的那样)


    编辑:

    但是,如果您确实需要全局标志,请尝试使用
    字符串
    -prototype的
    match()
    -方法,因为它不会超过以前的匹配。相反,它使用推进功能并捕获所有匹配项,然后重置索引

    var pattern = /^[\d\+]+$/g;
    "1".match(pattern); // => true
    "11+11".match(pattern); // => true
    "1+1abc".match(pattern); // => false
    

    你想干什么?你想匹配什么,不想匹配什么?@bnjmn:但是字符类后面有一个
    +
    。这个正则表达式应该匹配-一定还有其他问题。当对您提供的所有测试用例进行测试时,正则表达式返回
    true
    。。。您在哪个浏览器上运行此功能?@user3195878它似乎适合我们。你能提供一个例子来说明这个问题吗?@DoorknobofSnow谢谢你纠正我,我会急切地等着看:)如果他只想要数字(数字序列)和中缀加号,这不管用吗(如果我错了,请再次纠正我):
    /^\d*[\+\d*]*$/g
    ?你想匹配什么,不想匹配什么?@bnjmn:但是字符类后面有一个
    +
    。这个正则表达式应该匹配-一定还有其他问题。当对您提供的所有测试用例进行测试时,正则表达式返回
    true
    。。。您在哪个浏览器上运行此功能?@user3195878它似乎适合我们。你能提供一个例子来说明这个问题吗?@DoorknobofSnow谢谢你纠正我,我会急切地等着看:)如果他只想要数字(数字序列)和中缀加号,这不管用吗(如果我错了,请再次纠正我):
    /^\d*[\+\d*]*$/g
    ?你第一次做对了;将
    g
    标志与锚定在一端或两端的正则表达式一起使用是没有意义的。是的,这就是问题所在。为了方便起见,我将所有测试值放在一个数组中,并在其上循环。g旗实际上就是丘比特旗。谢谢你第一次做对了;将
    g
    标志与锚定在一端或两端的正则表达式一起使用是没有意义的。是的,这就是问题所在。为了方便起见,我将所有测试值放在一个数组中,并在其上循环。g旗实际上就是丘比特旗。谢谢