代码之家  ›  专栏  ›  技术社区  ›  icecub

试着用几种不同的格式匹配美国电话号码,按照regex101工作,而不是根据JS?

  •  1
  • icecub  · 技术社区  · 6 年前

    一般信息
    我试图匹配一大堆不同的美国电话号码格式,可能包括也可能不包括国家代码。

    问题
    我提出的regex符合我所有的要求,根据Regex101,我把语言设置为Javascript。然而,根据Javascript本身,它们并不匹配。


    function telephoneCheck(str) {
      const regex = RegExp('^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$','g');
    
      return regex.test(str);
    }
    
    // These all return false
    console.log(telephoneCheck("1 (555) 555-5555"));
    console.log(telephoneCheck("5555555555"));
    console.log(telephoneCheck("(555)555-5555"));
    console.log(telephoneCheck("1(555)555-5555"));
    


    https://regex101.com/r/RazBhG/1

    3 回复  |  直到 6 年前
        1
  •  1
  •   Tim Biegeleisen    6 年前

    除了正则表达式可能存在的逻辑问题外,最明显的问题是您正在使用 RegExp

    ^1?(?:\s*(?:\(\s*\d{3}\s*\)|\d{3})\s*)?\d{3}-?\d{4}$
    

    function telephoneCheck(str) {
        const regex = RegExp('^1?(?:\\s*(?:\\(\s*\\d{3}\\s*\\)|\\d{3})\\s*)?\\d{3}-?\\d{4}$', 'g');
        return regex.test(str);
    }
    
    console.log(telephoneCheck("1 (555) 555-5555"));
    console.log(telephoneCheck("5555555555"));
    console.log(telephoneCheck("(555)555-5555"));
    console.log(telephoneCheck("1(555)555-5555"));
    console.log(telephoneCheck("12345678901"));
    console.log(telephoneCheck("22345678901"));
    console.log(telephoneCheck("123456789"));
        2
  •  1
  •   Samathingamajig    6 年前

    构造正则表达式的方式似乎有问题。使用

    /regex/modifiers ==> /^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$/gm
    

    Mozilla Documentation
    W3Schools Documentation
    This video by Tom Scott also explains this notation

    function telephoneCheck(str) {
      const regex = /^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$/g;
    
      return regex.test(str);
    }
    
    // These now return true
    console.log(telephoneCheck("1 (555) 555-5555"));
    console.log(telephoneCheck("5555555555"));
    console.log(telephoneCheck("(555)555-5555"));
    console.log(telephoneCheck("1(555)555-5555"));
        3
  •  1
  •   Samathingamajig    6 年前

    改变 RegExp('^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$','g') 到 /^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$/g

    因为要将字符串传递给Regex构造函数,因此需要执行一些转换(双转义),例如:

    let re = /\w+/
    let re = new RegExp('\\w+')
    

    如果要使用regex,可以直接插入 /regexPattern/modifiers

    function telephoneCheck(str) {
      const regex = /^1? ?(\([2-9]{3}\) ?|[0-9]{3}(-| ))[0-9]{3}(-| )[0-9]{4}$|^[\d]{10}$/g;
    
      return regex.test(str);
    }
    
    // These all return false
    console.log(telephoneCheck("1 (555) 555-5555"));
    console.log(telephoneCheck("5555555555"));
    console.log(telephoneCheck("(555)555-5555"));
    console.log(telephoneCheck("1(555)555-5555"));