Регулярное выражение для извлечения номера телефона из абзаца

Просто фрагмент кода для извлечения номера телефона, если вы считаете, что это вам нужно, вы можете использовать его по лицензии WTFL.

interface PhoneNumberPattern {
    fun pattern(): Regex
    fun countryCode(): String
}

class UsPhoneNumberPattern : PhoneNumberPattern {
    override fun pattern(): Regex {
        return Regex("\\b\\d{3}[-.]\\d{3}[-.]\\d{4}\\b")
    }

    override fun countryCode(): String {
        return "US"
    }
}

class UkPhoneNumberPattern : PhoneNumberPattern {
    override fun pattern(): Regex {
        return Regex("\\b(\\+44|0)\\d{10}\\b")
    }

    override fun countryCode(): String {
        return "UK"
    }
}

class ThaiPhoneNumberPattern : PhoneNumberPattern {
    override fun pattern(): Regex {
        return Regex("((\\+66|0)(\\d{1,2}\\-?\\d{3}\\-?\\d{3,4}))|((\\+๖๖|๐)([๐-๙]{1,2}\\-?[๐-๙]{3}\\-?[๐-๙]{3,4}))")
    }

    override fun countryCode(): String {
        return "TH"
    }
}

class SingaporePhoneNumberPattern : PhoneNumberPattern {
    override fun pattern(): Regex {
        return Regex("\\b(\\+65)?\\s?\\d{4}[\\s-]?\\d{4}\\b")
    }

    override fun countryCode(): String {
        return "SG"
    }
}

class MixedPhoneNumberPattern : PhoneNumberPattern {
    override fun pattern(): Regex {
        return Regex("\\b(\\+\\d{1,2}\\s)?\\(?\\d{3}\\)?[.-]?\\s?\\d{3}[.-]?\\s?\\d{4}\\b")
    }

    override fun countryCode(): String {
        return "Mixed"
    }
}

class PhoneNumberExtractor(private val patterns: List<PhoneNumberPattern>) {
    fun extractPhoneNumbers(text: String): List<Pair<String, String>> {
        val phoneNumbers = mutableListOf<Pair<String, String>>()
        for (pattern in patterns) {
            pattern.pattern().findAll(text).forEach { matchResult ->
                phoneNumbers.add(Pair(matchResult.value, pattern.countryCode()))
            }
        }
        return phoneNumbers
    }
}

fun main() {
    val usPattern = UsPhoneNumberPattern()
    val ukPattern = UkPhoneNumberPattern()
    val thaiPattern = ThaiPhoneNumberPattern()
    val sgPattern = SingaporePhoneNumberPattern()
    val mixedPattern = MixedPhoneNumberPattern()

    val phoneNumberExtractor = PhoneNumberExtractor(listOf(usPattern, ukPattern, thaiPattern, sgPattern,mixedPattern))

    val text = "Potato's phone number is 123-456-7890. " +
            "Nyan's phone number is +1-555-330-3934. " +
            "Thet's phone number is (44)02074994340. " +
            "Ji soo's phone number is 0112345678. " +
            "Jake Wharton's phone number is +66 123456789. " +
            "Puppy's phone number is 89228926. " +
            "Sumail's phone number is +66925387009. "

    val phoneNumbers = phoneNumberExtractor.extractPhoneNumbers(text)

    println("Phone numbers found:")
    phoneNumbers.forEach { println("${it.second} ${it.first.trim()}") }
}

В настоящее время это не распространяется на все условия, которые я обновлю в будущем для дополнительного случая.

Текущий результат:

Phone numbers found:
US 123-456-7890
US 555-330-3934
UK 02074994340
TH 0207499434
TH 0112345678
TH +66925387009
SG 89228926
Mixed 123-456-7890
Mixed 555-330-3934
Mixed 0112345678

Спасибо, что нашли время прочитать эту статью. Я надеюсь, что мое письмо было информативным и наводящим на размышления.