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

我的正则表达式匹配正在抓取额外的前导空格和尾随空格。我如何才能只捕获电话号码?

  •  -1
  • sudoExclamationExclamation  · 技术社区  · 6 年前

    我正在使用此regex从长字符串中捕获电话号码:

    \s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*

    测试字符串:

    asdjasjkdh 1 800 555 1234 01/01/2012 asdhajksdh 18005551234 jkas 12/11/2012 hd sample@email.com asdha jksdh asjdhjak +86 800 555 1234 sdkajs test@gmail.com lorem ipsume. I am dotminors.zszsd@gmail.ca 18005551234 SADASDD +1 800 555-1234 SSDA ASASD 1-800-555-1234 1 (800) 555-1234 asdsasdadsadasda sdada 8005551234 x5678 wkadakasd asdjsadksad (800)5551234

    " 1 800 555 1234 ",
    "     18005551234 ",
    " +86 800 555 1234 ",
    " 18005551234 ",
    " +1 800 555-1234 ",
    " 1-800-555-1234 ",
    "1 (800) 555-1234 ",
    " 8005551234 x5678 ",
    " (800)5551234"
    

    正如您所注意到的,一些数字的开头或结尾都有空格。我怎么能只抓取电话号码部分,而不必再做单独的修剪?

    编辑: 如果我删除 \s* 在两端,它给了我一些缺少最后一个数字的电话号码。我用输出更新了我的问题:

    "1 800 555 1234",
    "     1800555123",
    "+86 800 555 1234",
    " 1800555123",
    "+1 800 555-1234",
    "1-800-555-1234",
    "1 (800) 555-1234",
    " 8005551234 x5678",
    " (800)5551234"
    

    正如您将要注意到的,第二和第四个电话号码在结尾处缺少“4”,并且仍然占据空白。

    1 回复  |  直到 6 年前
        1
  •  1
  •   CertainPerformance    6 年前

    除了移除 \s* 从开始到结束,还要删除第一个字符集的空格,在可选的捕获组之后-相反,放置空格 里面 第一个捕获组,以确保如果第一个组不匹配,则匹配不会以任何空格开始:

    (?:\+?(\d{1,3}) *)?[-.(]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?
                   ^^   ^^^
    

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

    推荐文章