Tag Archives: Regular Expression

예제로 이해하는 정규식 (Regular Expression)

다음의 예제로 정규식을 이해해 봅시다.

[code]#set $a = “hello”#
#set $b = [“hello”, “world”]#
#print $a#
#stop#[/code]

조건 :
1. 모든 문장은 #로 시작해서 #로 끝난다
2. #로 시작하여 공백이 나오거나 #로 끝나기 전까지는 영어 소문자만 가능하다
3. 이후 나오는 문자는 영어 소문자, $, =(1~2개), [, “, ,(콤마),  (공백) 만 사용가능하다
4. 큰따옴표 “”사이의 문자는 아무런 제약을 받지 않는다. 모든 문자 및 특수문자 사용가능
5. [“hello”, “world”]같은식으로 두개이상의 아무런 제약을 받지 않는 큰따옴표 문자가 존재한다 (4번 규약 무한 반복 가능)
6. 두개이상의 공백이 있을수 있다

나의 경우에는 먼저 여러종류의 사용가능한 코드를 생각해 내고 거기에 맞추어 조건을 생각해 냈다.

이제 내가 원하는 문자만 검색할수 있도록 해보자.

1. 모든 문장은 #로 시작해서 #로 끝난다는 조건이 있다. 일단 그 사이에는 어떤 문자가 있어도 상관없다.
시작과 끝을 #로 한다고 하니 #로 설정한다. 그 중간에는 우선 어떤 문자가 와도 상관없으니 아무문자와 매치 되는 .을 쓰고 0개~무한 반복을 뜻하는 *을 쓰자. 혹시 한개이상의 문자가 필요하다면 +를 사용하면 된다.
결과 : #.*#

2. #로 시작하여 공백이 나오거나 #로 끝날때까지는 영어 소문자만 가능하다고 한다. 영어 소문자 리스트에 Arrange설정을 하자. 공백이 있어도 되고 없어도 되는 경우이므로 0~무한 매치인 *를 사용한다. 있는 경우에는 2개 이상이 될수도 있음을 분명히 하자. 공백문자(스페이스, 탭등)을 뜻하는 [\s]를 사용하자. [[:space:]]와 같은 문법도 클래스 형태로 제공하므로 사용해도 된다.
결과 : #[a-z]+[\s]*#

3. 이후 나오는 문자는 변수명과 = [ , ” (공백) 등만 사용 가능하다. =는 1개나 2개만 사용가능하다는것도 잘 이해해 두자. ‘?’의 경우 반복없이 한번만 있을수도 있고 없을수도 있다는 뜻이다.
큰따옴표 안에는 아무런 제약을 받지 않는다고 한다. .*을 이용해 주면 모든 문자에 매치될수 있을것이다.
결과 : #[a-z]+[\s]*[a-z\$]+[\s]*={1,2}[\[]?[\s]*\”.*\”[\s]*[\]]?[\s]*#

4. “hello”, “world”같이 여러개가 설정 가능하다고 한다. 어떻게 해야 할까? 그룹()으로 설정하면 된다.
한개는 무조건 있어야 하는것이고 두번째부터는 없을수도 있고 여러개일수도 있다. (blahblah)*식으로 그 그룹에 정의된 단위대로 0개이상의 반복을 할수 있다.
결과 : #[a-z]+[\s]*[a-z\$]+[\s]*={1,2}[\[]?[\s]*\”.*\”([\s]*,\”.*\”)*[\s]*[\]]?[\s]*#


최종 결과 : 

#[a-z]+[\s]*[a-z\$]+[\s]*={1,2}[\[]?[\s]*\”.*\”([\s]*,\”.*\”)*[\s]*[\]]?[\s]*#

어떤가요?