티스토리 뷰

반응형

https://www.test.com/users?gender=male&age=20&job=designer

 

위와 같은 get 요청에서 

gender=male

age=20 

job=designer 

 

같은 파라미터를 구하려면 어떻게 해야할까요?!? 

 

저는 정규표현식을 이용했습니다.

Swift에서 정규표현식(Regular Expression)을 이용하기 포스팅에 차마 이어쓰지 못하겠어서(😱) 새롭게 씁니다.

하지만 자세한 설명은 저기에 있습니다. 여기에는 간략하게! 

 

결론

이렇게 extension을 추가하고

 

 

 

 

정규표현식 패턴으로 아래의 것을 쓰면 됩니다.

[^&?]+=[^&?]+

 

테스트를 돌리면 성공하는 것을 볼 수 있습니다. 

 

 

 

 

과정

저렇게 테스트가 성공할 수 있는 과정을 살펴보겠습니다. 

 

우선 

[^?&] 이거 부터 살펴보자면

대괄호[]는 한 문자를 의미하고

대괄호 안에 ^를 쓰면 부정(not)의 의미를 가집니다.

 

즉 [^?&]는 ?랑 &가 아닌 한 문자를 의미합니다. 

 

 

그래서 이 사이트에서 테스트 해보면 (참고로 이 사이트는 swift 랭기지 설정을 할 수 없습니다)

&랑 ?가 아닌 한문자들로 총 56개가 매칭되는 것을 볼 수 있습니다. 

 

 

 

그 다음, [^?&]+를 살펴보겠습니다.

+는 정규표현식에서 1개~여러개를 의미합니다.

 

?랑 &가 아닌 1개~여러개 문자들이 선택되는 것을 볼 수 있습니다. 총 4개가 매칭된다고 나옵니다

 

 

 

그 다음, [^&?]+=[^&?]+ 를 살펴보겠습니다.

"?랑 &가 아닌 1개~여러개 문자들 = ?랑 &가 아닌 1개~여러개 문자들"

이렇게 된 패턴을 찾는 것입니다. 

 

총 3개가 잘 매칭되는 것을 볼 수 있습니다.

 

 

 

 

추가로 이렇게 딕셔너리로 만들어서 value값을 꺼내는 식으로 활용할 수 있을 것 같네요 :-) 

 

 

 

[ 추가 ]

정규표현식말고 이런 extension 만들어서 사용할 수도 있어요-!! 

extension URL {

    public var parameters: [String: Any?] {
        var dic: [String: Any?] = [:]
        
        guard let components = URLComponents(url: self, resolvingAgainstBaseURL: false) else { return dic }
        guard let queryItems = components.queryItems else { return dic }
        
        for item in queryItems {
            dic[item.name] = item.value
        }
        return dic
    }
}
반응형
댓글