정규식   article search result : 2

정규식 사용하기 (2)

지난 시간에 이어서 계속해서 정규식을 배워보도록 하겠다.

6. 임의의 숫자를 나타내는 \d

\d는 임의의 숫자를 나타낸다. 이때 d는 digital의 약자이다. digit은 프랑스어의 doigt가 솓가락을 의미하듯, 0-9 사이의 숫자를 나타낸다. 따라서 \d는 [0-9]로 표현해도 상관없다. 우선 다음 예제를 보도록 하자.

이 예제는 숫자가 시작하는 부분을 찾기 위한 정규식이다. 만약 정규식을 안 쓰고 특정 문자열에서 숫자가 시작하는 부분을 찾는다고 하면 어떻게 할 것인가? 아마도 대부분의 사람들은 문자열의 처음부터 시작해 한 글자씩 문자열인지 숫자인지 비교해 보고, 숫자가 나올 때 해당 문자의 인덱스를 리턴하는 방식을 택할 것이다. 하지만 정규식을 사용하면, 이렇게 간단한 로직만으로 이러한 문제를 해결할 수 있다.

이어서 다음 예제를 살펴보도록 하자. 이번에는 숫자가 세개 이어서 나와야 하는 경우이다. 이런 경우에는 {최소 숫자, 최대 숫자} 방식을 쓴다.

{ }에서 최대 숫자는 반드시 넣을 필요는 없지만, 최소 숫자는 반드시 넣어 주어야 한다. 예컨대, {1,3}은 최소 1개 이상에서 최대 3개까지를 의미하고, {1}은 정확히 1개, {1,}은 1개 이상을 의미한다
.

이 예제에서는 \d와 { }를 사용해 숫자 3개 + 임의의 문자/숫자/기호 + 숫자 3개 + 임의의 문자/숫자/기호 + 숫자 3개가 나오는 패턴의 문자열을 찾고 있다. \d{3}은 "숫자 세개가 연속한 숫자"라는 의미이다. \d{3}.에서 .은 임의의 문자 또는 숫자 또는 기호를 나타낸다. 따라서 위의 패턴은 예컨대, 111-222-333에도 매칭된다.

만일 문자 그대로의 점을 찾을 때는 .가 아닌 \.을 사용해야 한다. { } 표현에 대해 조금 더 깊게 생각해 본다면, 위의 정규식은 다음과 같이 바꿀 수도 있다.



여기서는 괄호를 썼는데, 괄호로 묶인 부분은 하나의 문자열 그룹이 된다. 하나의 그룹으로 묶인 문자열은 검색시 하나의 단위로 묶이기 때문에 나중에 문자열을 수정해야 할 필요가 있거나 논리적으로 명확히 구별되는 부분은
이처럼 괄호로 묶어서 그룹화하는 것이 좋다.

괄호 자체가 정규식에서는 특수하게 해석되기 때문에 (는 \(로 쓰지 않는 한, 항상 문자열 그룹을 지정하기 위한 것으로 생각해야 한다. (\d{3}.){2}는 해석하면, "숫자 3개 + 임의의 문자/숫자/기호로 이어진 문자열이 두번 연속으로 나오는 문자열"로 해석할 수 있다. 따라서 이러한 문자열은, 예컨대 111.222 또는 111-222 또는 111a222 정도의 문자열이 되겠다. 물론, 1113222도 된다.

여기서 의아해할 사람이 있을 수 있는데, 다시 위의 설명을 읽어보자. 정규식에서 점은 어떠한 것이라도 받아들일 수 있다는 허락의 의미를 갖는다. 따라서 1113222 든 1111222든 위 정규식에는 모두 부합한다.

note: 문자 그대로의 점을 사용하려면 \.을 사용해야 한다. 예컨대 111.222.333으로 정의되는, 즉, 숫자 3개 + 점 + 숫자 3개 + 점 + 숫자 3개로 정확히 끝나는 패턴의 문자를 찾으려면, 다음과 같이 해야 한다.

7. 임의의 문자를 의미하는 \w

임의의 문자를 찾으려면 \w을 사용하면 된다. 지난 시간에 배운 것을 조금 응용해 보면, 예컨대 0개 이상의 임의의 문자를 찾으려면 /\w?/ 또는 /\w*/을 사용하면 된다. 물론, 개수를 알고 있는 경우라면, /\w{2}/ 처럼 해도 되겠다. 다음 예제는 문자 3개 다음에 숫자 4개가 이어지는 문자열을 찾는 정규식이다.

물론 앞에서 보았듯이 .이 문자든 숫자든 모두 커버할 수 있기 때문에, /.{7}/이라고 해도 위의 abc1111은 패턴에 부합하게 된다. 하지만 이 패턴은 단순히 7자리의 임의의 문자/숫자/기호로 이루어진 문자열을 말할뿐 문자 몇개 + 숫자 몇개로 이루어진 문자열을 찾아주지는 못한다.

따라서 특정 자리에 문자 몇개가 와야 하고 이어서 숫자 몇개가 와야 한다면, 반드시 /\w{문자 개수}\d{숫자 개수}/ 패턴을 사용해야 한다.

8. 모든지 다 받아줄 수 있는 .의 사용법

예컨대, 10자리 날짜를 표현할 때, 어떤 사람은 2008/10/08이라고 하고 어떤 사람은 2008-10-08이라고 하고 어떤 사람은 2008.10.08이라고 한다고 해 보자. 이처럼 특정 문자를 이어주는 문자가 가지 각색일 때에는 패턴 중간에 .을 사용하는 것이 좋다. 물론, 지난 시간에 배운 것처럼 [-.\/]을 사용해도 되겠지만, (예외적으로 [ ] 안에서 .은 그냥 문자 그대로의 점을 의미한다. 하지만 문자 그대로의 /의 경우에는, [ ]안에서도 정규식을 닫는 의미의 /로 해석되기 때문에, 문자 그대로의 /를 [ ] 안에서 사용하려면 앞에 \을 붙여주어야 한다) 사용자가 2008a10b08처럼 엉뚱하게 입력할 걱정이 없는 경우에는 그냥 .을 써도 무방하다.

이 정규식은 숫자 4개 + 임의의 문자/숫자/기호 + 숫자 두개 + 임의의 숫자/문자/기호 + 숫자 두개가 연속해서 나오는 문자열을 정의하고 있다. 이 때 임의의 숫자/문자/기호가 아닌 특정 기호 가운데 하나를 선택하게 하려면 [ ] 안에 해당되는 기호들을 정의하면 된다.

다음 시간에는 이렇게 찾은 문자열들을 하나씩 바꾸어 보도록 하겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/08 22:45 2008/10/08 22:45
REPLY AND TRACKBACK RSS http://joshy21.com/weblog/rss/response/8
REPLY AND TRACKBACK ATOM http://joshy21.com/weblog/atom/response/8
TRACKBACK ADDRESS
http://joshy21.com/weblog/trackback/8
REPLY RSS http://joshy21.com/weblog/rss/comment/8
REPLY ATOM http://joshy21.com/weblog/atom/comment/8
[로그인][오픈아이디란?]
이름 :
비밀번호 :
홈사이트 :
비밀글 :

정규식 사용하기 (1)

문제점 : 정규식은 암호같아서 사용하기 어렵다.

해결책 : 정규식의 사용법은 생각보다 쉽다.

이번에는 간단한 정규식의 작성법을 살펴보도록 하겠다.

1. 단순 문자열 비교 단순 문자열의 경우에는 그냥 정규식을 선언하고 찾는 문자열을 /와 /사이에 넣어주면 된다.

String 객체의 search 메소드는 정규식에 해당하는 패턴의 문자가 발견되면, 발견된 첫 인덱스를, 없으면 -1을 반환한다.
 
2. 대소문자 구분없이 비교 대소문자 구분없이 문자를 비교하려면 처럼 / /이후 i 플래그를 넣어주어야 한다.

3. OR 조건 문자열 비교 / /안에 | 를 넣으면 | 안에 있는 문자들 중 하나에만 매치되면 해당 패턴에 부합되게 된다. 즉, 위에서는 대상 문자열이 Action으로 시작하든, Java로 시작하든, Perl로 시작하든, 뒤에 문자열에 Script이기만 하면 패턴에 부합된다. 또 위에서는 / /다음에 i를 사용하고 있기 때문에 AcTIon 또는 JAva, PERl 과 같이 대소문자가 섞여있는 문자들도 검색할 수 있다.

4. 여러 문자열 중 하나를 포함하는 문자열 비교 [ ]안에 문자를 넣으면, 그 문자중 한 글자를 포함하면 패턴에 부합하게 된다. 예를 들어, 위의 예제는 volcano에서 모음(a,e,i,o,u)만 추출한 예제이다. 이 때 [ ]는 |와는 달리 문자 한 개만 검색한다는 점을 주의해야 한다. 문자 여러개의 OR 조건으로 검색할 때에는 |을 써야 한다. 참고로 g 플래그는 한번만 검사하는 게 아니라 나올 때까지 계속 검사한다는, global 플래그이다.

5. 선택 문자열을 포함하는 문자열 비교

선택 문자열을 포함하는 문자열을 비교할 때에는, ?를 사용한다. ?는 앞의 패턴의 문자가 0번 이상 반복된다는 것을 의미한다. 이번 예제는 지금까지 배운 내용들을 응용한 예제이다.

먼저 [Aa]는 첫 글자가 대문자 A 또는 소문자 a에 부합해야 한다는 뜻이다. 어쨌든, 이 정규식은 찾는 글자가 소문자든 대문자든 A로 시작해 이어서 바로 ction이 나와야 한다. 그런데 뒤이어서 나오는 글자는 Script 또는 script인데, 이 때 S는 소문자일 수도 있고 대문자일 수도 있다 ([ ]사용). 그리고 Script는 괄호로 묶여서 ?플래그가 붙었는데, 이는 Script가 나올 수도 있고 안 나올 수도 있다는 것이다.
 
예를 한번 들어보자.

SELECT 컬럼명 FROM 테이블명 WHERE ~ 에서

WHERE절은 나올 수도 있고 안 나올 수도 있다.

바로 이럴 때 (where)? 라고 쓰면 된다.

다음 편에 계속..............
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/06 13:41 2008/10/06 13:41
REPLY AND TRACKBACK RSS http://joshy21.com/weblog/rss/response/7
REPLY AND TRACKBACK ATOM http://joshy21.com/weblog/atom/response/7
TRACKBACK ADDRESS
http://joshy21.com/weblog/trackback/7
REPLY RSS http://joshy21.com/weblog/rss/comment/7
REPLY ATOM http://joshy21.com/weblog/atom/comment/7
[로그인][오픈아이디란?]
이름 :
비밀번호 :
홈사이트 :
비밀글 :
*1 
count total 10250, today 15, yesterday 18
관리인 : eirene
rss
I am
전체
Development
La vie quotidienne
English
Languages
Jesus
글 보관함
2010/01, 2009/06, 2009/03, 2009/02, 2009/01,
달력
«   2010/03   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31