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

为什么我的正则表达式无法检测以特定模式写入的电话号码?

  •  0
  • PeakGen  · 技术社区  · 4 年前

    我有一个正则表达式来检查短信中的电话号码。请在下面查看。

    (\d[\s-]?)?[\(\[\s-]{0,2}?\d{3}[\)\]\s-]{0,2}?\d{3}[\s-]?\d{4}
    

    这个正则表达式可以很好地工作,但如果我这样写的话,它就不能很好地工作。

    1. 例1:088122458
    2. 例2:+1881122458

    如何修改正则表达式来修复此错误?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Wiktor Stribiżew    4 年前

    您可以添加一个可选的 + 开始时,允许区号中有两个或三个数字,并添加一个替代项以匹配两个两位数,然后在末尾添加一个三位数的块:

    (?:\+?\d[\s-]?)?[([\s-]{0,2}\d{2,3}[)\]\s-]{0,2}(?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3})
    

    看到了吗 regex demo . 细节 :

    • (?:\+?\d[\s-]?)? -可选择的事件 可选 + ,一个数字,然后是空格或连字符
    • [([\s-]{0,2} -零,一或二 ( , [ ,空格或连字符
    • \d{2,3} - 两个或三个数字
    • [)\]\s-]{0,2} -零,一或二 ) , ] ,空格或连字符
    • (?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3}) -两个
      • \d{3}[\s-]?\d{4} -三位数字,可选空格或 - ,四位数
      • | -或者
      • \d{2}[\s-]?\d{2}[\s-]?\d{3} -两位数字,可选空格或 - ,两位数字,可选空白或 - ,三位数

    您还可以考虑添加数字边界,以禁止左侧有其他数字(带负数)的匹配 (?<!\d) 向后看)和右边(带负片) (?!\d) 展望未来):

    (?:\+?(?<!\d)\d[\s-]?)?[([\s-]{0,2}(?<!\d)\d{2,3}[)\]\s-]{0,2}(?:\d{3}[\s-]?\d{4}|\d{2}[\s-]?\d{2}[\s-]?\d{3})(?!\d)
    

    看见 this regex demo .

        2
  •  1
  •   GriGrim    4 年前

    我会用这个正则表达式: [\+\(\[]?\d[\(\[\s-]?\d[\s-]?\d[\)\]\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d[\s-]?\d

    它允许在任何地方使用分隔符。 有时电话号码是分隔符,这样更容易记住。

    例如:

    • 088 111-2-111
    • (088)11-22-33-4