저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
정규표현식 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
이메일 주소 검사하기
다음은 regexp 패키지에서 제공하는 정규표현식 컴파일 함수와 검사 함수입니다.
- func Compile(expr string) (*Regexp, error): 정규표현식을 컴파일하여 Regexp 인스턴스를 생성
- func (re *Regexp) MatchString(s string) bool: 문자열이 Regexp 인스턴스에 정의된 정규표현식에 맞는지 검사
실무에서 많이 사용하는 이메일 주소 정규표현식을 알아보겠습니다.
package main
import (
"fmt"
"regexp"
)
func main() {
var validEmail, _ = regexp.Compile(
"^[_a-z0-9+-.]+@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$",
)
fmt.Println(validEmail.MatchString("hello@mail.example.com")) // true
fmt.Println(validEmail.MatchString("hello+kr@example.com")) // true
fmt.Println(validEmail.MatchString("hello-world@example.co.kr")) // true
fmt.Println(validEmail.MatchString("hello_1@example.info")) // true
fmt.Println(validEmail.MatchString("gildong.hong@e-xample.com")) // true
fmt.Println(validEmail.MatchString("@example.com")) // false
fmt.Println(validEmail.MatchString("hello@example")) // fasle
fmt.Println(validEmail.MatchString("hello@example.cooooooom")) // false
}
보통 회원 가입 단계에서 이메일 주소가 정상인지 검사할 때가 많습니다. 이 때는 정규표현식을 사용하면 편리합니다. 먼저 이메일의 규칙은 계정@도메인.최상위도메인
형식이며 계정에 +, -, _등의 기호를 붙이기도 합니다. 그리고 도메인에도 - 기호를 사용할 수 있고, 최상위 도메인이 여러 단계일 수 있습니다. 이런 규칙을 정규표현식으로 표현하면 다음과 같습니다.
"^[_a-z0-9+-.]+@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$"
부분 부분으로 나누어 생각하면 쉽게 이해할 수 있습니다.
- ^[_a-z0-9+-.]+@는 @를 기준으로 계정을 표현합니다. ^가 붙었으므로 무조건 문자열의 맨 앞에 와야합니다. 그리고 [_a-z0-9+-.]+이므로 영문 소문자, 숫자, _, +, -, .으로 계정이 만들어져 있어야 하고, 한 글자라도 있어야 합니다(+). 즉 예제와 같이 hello, hello+kr, hello-world, hello_1, gildong.hong 등을 표현할 수 있습니다.
- [a-z0-9-]+(\\.[a-z0-9-]+)*는 서브 도메인, 도메인 부분입니다. 이렇게 각 부분이 +, *로 구분되는 부분은 괄호로 묶어줍니다. 영문 소문자와 숫자 -로만 서브 도메인, 도메인이 만들어져 있어야 하고, 한 글자라도 있어야 합니다. 여기서 (\.[a-z0-9-]+)*처럼 괄호로 묶은 뒤 *를 사용하면 이 부분은 있어도 되고 없어도 된다는 뜻입니다. 보통 서브 도메인은 없을 수도 있기 때문입니다. 즉, 예제와 같이 mail.example.com, example.co, e-xample 등을 표현할 수 있습니다.
- (\\.[a-z]4)$는 최상위 도메인(TLD) 부분입니다. 소문자만 사용할 수 있고 문자열의 맨 뒤에 와야 합니다. 여기서 {2,4}처럼 중괄호에 숫자를 지정하여 최소 개수, 최대 개수를 표현할 수 있습니다. 따라서 영문 소문자 2개에서 4개까지 입니다. 즉 예제와 같이 .com, .kr, .info 등을 표현할 수 있습니다(실제로는 4글자 이상인 TLD도 있으므로 상황에 맞게 수정하여 사용합니다).
복잡한 정규표현식은 regexp.Compile 함수로 컴파일 해두었다가 나중에 반복해서 사용할 수 있습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.