var regular = /^(\(?:0\d{2,3}\))|(?:0\d{2,3})/大家看看这段正则不知道为什么,它居然匹配:(021 我有点搞不懂了,明明我写的是2段表达式然后在用|去or匹配带()或者不带都通过 也就是开头可以是0或者(开头的但是如果是括号开头的话必须以)结尾,开始为什么我现在半个括号也是通过的?现在我是知道的 这段正则有问题的 谁帮我翻译下我这么写的问题所在和我这样写是怎么样一个表述,非常感谢还有()里面是指所有的内容都必须实现才匹配????

解决方案 »

  1.   

    用这个吧
    var re = /^(0\d{2,3}|\(0\d{2,3}\))$/;
      

  2.   

    var regular = /^(?:\(0\d{2,3}\))|(?:0\d{2,3})/这可能是你想要的
      

  3.   

    谢谢各位lihui_shine你为什么分组放到一个组里面呢?不是放到一个组里面要都匹配才通过的吗?
      

  4.   

    谢谢各位 我找到问题了 确实像lihui_shine做的一样只需要将2个正则的组位置兑换下就可以了 不过我还是 不知道为什么兑换位置后就可以实现呢??帮下忙结束下谢谢var regular = /^(?:0\d{2,3})|(?:\(0\d{2,3}\))$/
      

  5.   

    你是不是搞错了,你这个跟顺序无关的,你写成/(\(0\d{2,3}\)|0\d{2,3})/g或者/(?:0\d{2,3})|(?:\(0\d{2,3}\))/g匹配的结果是一样的
    不信你在这个工具上试试:
    http://www.renrousousuo.com/tools/regex_debug.html你最先的那个var regular = /^(\(?:0\d{2,3}\))|(?:0\d{2,3})/
    应该改为
    /(?:\(0\d{2,3}\))|(?:0\d{2,3})/g
    这样就行了。修改的部分:
    1. 去掉^
    2. 把?:放到第一个括号后!因为第一个括号才是代表分组!