You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写更通用的电话号码捕获正则表达式——Kotlin+JSoup提取问题

解决Kotlin+JSoup提取带括号/空格电话号码的正则问题

我明白你现在的困扰——现有正则能抓+1-###-###-####这种格式,但碰到带空格和括号的号码就歇菜了对吧?咱们来调整一下正则,让它能覆盖更多常见的电话号码格式。

问题分析

你原来的正则\\+[0-9.()-]{7,15}的局限在于:

  • 没有包含空格这个常见的分隔符,所以+1 (###) ###-####里的空格会导致匹配失败
  • 只是简单允许括号存在,但没有考虑括号的成对出现(虽然实际匹配时单个括号也能过,但精准度不够)
  • 对号码结构的约束太松散,容易误匹配其他带加号的字符串

改进后的正则方案

针对你提到的美国号码格式(+1开头),我们可以用更精准的正则来匹配:

val phonePattern = Regex("""\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}""")

这个正则的拆解:

  • \\+:匹配电话号码开头的加号
  • \\d{1,3}:匹配1-3位的国家代码(比如+1、+44、+86等)
  • \\s?:匹配可选的空格(比如+1 (xxx)里的空格)
  • \\(?:匹配可选的左括号
  • \\d{3}:匹配3位区号
  • \\)?:匹配可选的右括号
  • [-.\\s]?:匹配可选的分隔符(横杠、点、空格三选一)
  • \\d{3}:匹配中间3位数字
  • [-.\\s]?:再次匹配可选的分隔符
  • \\d{4}:匹配最后4位数字

优化后的Kotlin代码

除了正则,咱们也可以优化一下代码逻辑,避免空指针风险,同时更高效地提取号码:

val phonePattern = Regex("""\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}""")
val numbers = doc.getElementsMatchingOwnText(phonePattern)
    .flatMap { element ->
        // 用text()代替toString(),只取元素的纯文本内容,避免HTML标签干扰
        phonePattern.findAll(element.text())
            .map { it.value } // 提取每个匹配到的号码
            .toList()
    }

额外说明

如果需要匹配更多其他国家的号码格式(比如长度不同的号码),可以调整正则里的数字长度约束。比如把\\d{3}[-.\\s]?\\d{4}改成\\d{6,10}来适配更长或更短的号码主体,但这样会降低精准度,建议根据你要爬取的网页号码格式针对性调整。

你可以用以下测试用例验证:

  • +1 (123) 456-7890
  • +1(123)456-7890
  • +1-123-456-7890
  • +1 123.456.7890
    这些格式现在都能被正确捕获啦!

内容的提问来源于stack exchange,提问作者mox_mox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:32:45