[Swift] 여러 텍스트에서 전화번호만 추출하기

김상우·2022년 1월 31일
1

지금 개발하고 있는 앱에서, String 배열이 무작위로 쭉 있을 때, 전화번호 형식이 있다면 리턴해주는 함수가 필요했다. 코시국 안심콜 전화를 위해서.

["0101", "훼이크", "080", "응 아니야", "080", "-12", "3", "-", "4567"] 라는 String 배열이 있다면 0801234567 만 정확히 뽑아줘야 한다.

일단은 파이썬이 더 편하기 때문에.. 파이썬으로 먼저 짜보고 Swift 로 옮겼다.


Python 코드

# AI 문자인식 결과 elements

resultElements = [["ksw", "-", "+++", "O80", "-", "1234-5", "678"],
                  ["bsj", "ㅇ8O-1234", "5678"],
                  ["080", "-", "1111", "-", "2222", "ksw", "12345678"],
                  ["0101", "훼이크", "080", "응 아니야", "080", "-", "123", "-", "4567"]]

# AI 가 0, ㅇ, O, o 를 헷갈려하고 있다.
confusingWithZero = ['o', 'O', 'ㅇ']


def isConsideredAsNumber(x):
    if (x in ['o', 'O', 'ㅇ', '-', '.']) or x.isdigit():
        return True
    else:
        return False


def elemIsNumber(elem):
    result = True
    for x in elem:
        if not isConsideredAsNumber(x):
            result = False
            break
    return result


def refineElemNumber(number):
    result = ""
    for x in number:
        if x.isdigit():
            result += x
        elif x in ['o', 'O', 'ㅇ']:
            result += "0"
    return result


def getTELNumber(elements):
    for element in elements:
        answer = ""
        for elem in element:
            if elemIsNumber(elem):
                answer += refineElemNumber(elem)
            else:
                answer = ""

            if 10 <= len(answer) <= 11:
                break

        print(answer)


getTELNumber(resultElements)

Swift 코드

import Foundation

var recognizeResultElements: Array<String> = Array<String>(["0101", "훼이크", "080", "응 아니야", "080", "-12", "3", "-", "4567"])

let consideredAsNumber: Array<Character> = Array<Character>(["o", "O", "ㅇ", "-", "."])
let confusingWithZero: Array<Character> = Array<Character>(["o", "O", "ㅇ"])

func isConsideredAsNumber(_ x: Character) -> Bool {
    if consideredAsNumber.contains(x) || x.isNumber {
        return true
    }
    else {
        return false
    }
}

func elemIsNumber(_ elem: String) -> Bool {
    var result: Bool = true
    for x in elem {
        if !isConsideredAsNumber(x) {
            result = false
            break
        }
    }
    return result
}

func refineElemNumber(_ number: String) -> String {
    var result: String = ""
    for x in number {
        if x.isNumber {
            result += String(x)
        }
        else if confusingWithZero.contains(x) {
            result += "0"
        }
    }
    return result
}

func getTELNumber(_ elements: Array<String>?) -> String? {
    guard let elements = elements else { return nil }
    var answer = ""
    for elem in elements {
        if elemIsNumber(elem) {
            answer += refineElemNumber(elem)
            
        }
        else {
            answer = ""
        }
        
        if 10 <= answer.count && answer.count <= 11 {
            break
        }
    }
    return answer
}

getTELNumber(recognizeResultElements)
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글