왕초보를 위한 Regular Expressions (1) cs

예전에도 언급한 바 있지만, 정규표현식은 언젠가는 취미로라도 마스터하고 싶은 대상 중 하나다. 

결국 책 한 권을 샀다. 생각보다 아담해서 좋다. 

기억도 정리할 겸 예제 중심에 초보자의 입장에서 정리를 한 번 해보려고 한다. 경험상 익숙해져버리면 초보자의 시선을 기억하지 못하게 되니까.. (김군, 보고있나? ㅎㅎ)

정규표현식 연습은 아래 사이트에서 하면 되겠다. 

위 텍스트박스에 정규표현식을 쓰면 아래 텍스트박스에 있는 내용 중 정규식에 일치하는 부분을 노란색과 파란색으로 번갈아 하이라이트해준다. 


자, 우선 위 책 CH1의 결과물을 써보도록 하자.


(^\+82[.-][1-9]\d?[.-]|^\(?0[1-9]\d?\)?[.-]?)?[1-9]\d{2,3}[.-]\d{4}$


위 그림과 같이 한국의 전화번호에 해당하는 열을 골라내는 정규표현식이다. 한 줄 내에 온전하게 들어있어야만 뽑아낸다. 단, 하이픈이나 점으로 구분은 반드시 해야 한다. 

이 정규표현식은 크게 두 부분으로 나뉜다. 
첫번째 부분: (A) (국가번호)-(지역번호 or 핸드폰번호) 또는, 그냥 (B) (지역번호 or 핸드폰번호) <-- 생략해도 되는 부분

첫번째 부분은 괄호로 묶여 있으며, 마지막에 "?"가 붙어 있다. ?는 0번 이상 반복되는 수량자이다. 즉, A영역은 있어도 되고 없어도 된다는 것을 의미한다. 

이 부분은 다시 파이프(|)를 중심으로 두 부분으로 나뉜다. X|Y 라고 하면 X 또는 Y를 의미한다. 이는 국가번호가 붙어 있는 경우와 그렇지 않은 경우를 모두 처리해주기 위한 것이다. 파이프 왼쪽을 A-1, 오른쪽을 A-2 라고 한다면, 

A-1 부분의 정규표현식은 다음과 같이 쪼갤 수 있다. 

  • ^ : 행의 맨 앞을 의미한다. 즉, 이 부분은 행의 맨 앞에 있어야만 매칭이 된다. 
  • \+ : 일반문자 +를 의미한다. 역슬래시(\)를 붙인 이유는 +가 정규식이 아니라 일반 + 문자임을 의미하기 위한 것이다. 
  • 82 : 이건 그냥 문자열 "82"를 의미한다. +82는 한국의 국가번호다. 
  • [.-] : 대괄호([  ])는 문자클래스를 지칭하는 정규식이다. 대괄호 안에 있는 문자들은 모두 or로 묶인다. 따라서 [.-]는 점문자(.) 혹은 하이픈(-)을 의미한다. 수량자 ?가 붙지 않았으므로 반드시 둘 중 한 문자로 연결되어야 함을 의미한다. 
  • [1-9] : 1부터 9 사이의 숫자, 즉 0을 제외한 모든 숫자를 의미한다. 
  • \d? : \d는 임의의 숫자(decimal)를 의미한다. 
  • [.-] : 점 혹은 하이픈이 정확히 1개 있을 것

A-2 부분의 정규표현식은, 

  • ^ : 행의 맨 앞
  • \(?	
    : 괄호를 일반식으로 만들기 위해 역슬래시가 붙은 것이다. 수량자 ? 가 붙었으므로 괄호가 있거나 없거나를 의미한다.
  • 0 : 일반문자 0. 한국의 전화번호 첫자리는 반드시 0으로 시작하므로 이렇게 강제
  • [1-9] : 그다음 문자는 반드시 0이 아니므로(만일 두번째 자리도 0이 가능하다면 그냥 \d나 [0-9]를 쓰면 됨
  • \d? : 첫 자리수는 핸드폰이나 지방일 경우 3자리, 아니면 2자리일 수도 있으므로 ?를 넣은 것
  • \)	: 일반문자 )
  • [.-]? : 점이나 하이픈이 0개 이상 있을 것(물음표를 떼었어야 하는데 실수함)

A 전체는 괄호로 감싸서 참조그룹임을 명시하고 있고, 물음표를 붙여서 이러한 패턴이 0개 이상 반복되어야 함을 명시하고 있다. 참조그룹일 경우 나중에 \1 \2 등으로 부를 수 있는데, 여기에서는 부르기 위함이 아니라 그룹임을 명시하기 위해서 사용했다.

두번째 부분: (0 아닌 숫자로 시작하는 3~4자리 숫자) - (4자리숫자) <--- 반드시 있어야 하는 부분
이 영역의 의미는 다음과 같다. 중복된 부분은 생략한다. 
  • [1-9]
  • \d{2,3} : \d (숫자문자)가 2 혹은 3회 반복됨. 위 [1-9]와 결합하여 0아닌 숫자로 시작하는 3 혹은 4자리 숫자패턴을 의미하게 된다. 중괄호({ })는 반복을 의미하는 수량자이다. 
  • [.-]
  • \d{4} : 숫자문자 4회 반복. 한국의 전화번호 마지막 자리는 4자리 숫자이므로. 

마지막의 $ 는 ^의 반대, 즉 가장 마지막 자리를 의미한다. 따라서 이 패턴 뒤에 무슨 글자가 있으면 패턴으로 인식 안한다. 


그런데, 이 정규표현식은 한계가 있다. 맨 처음의 그림을 보면 5번째 줄의 글자, 5011- 로 시작하는 부분도 하일라이트가 되어 있다. 이것은 선택되지 않게 하고 싶은데.. 방법이 있을 것 같은데 잘 모르겠다. 좀 더 고민해보고 정확한 답을 찾으면 수정하도록 하겠다

찾았다. 위 정규식 가장 앞에 ^를 추가하면 된다. 그러면 반드시 맨 앞에서 시작함을 강제하여 5011- 로 시작하는 놈을 선택하지 않게 만들 수 있다. 

만일 위 식을 문자열 중간에 낑겨 있는 놈을로 찾고 싶다면 ^를 없애고 $를 \b로 바꾸면 된다.(해보니 대체로 작동은 하는데 완전하지는 않다. 만일 1234-5678-9012 같은 경우, 네자리-네자리를 지역번호 없는 일반전화로 인식한다. 이건 배제하고 싶다. 방법은 더 생각해봐야겠다)


덧글

댓글 입력 영역



twitter

Twitter

MathJax