Regular Expression 들어가기에 앞서


1950년대 Stephen Kleene에 의해서 생각된 개념입니다.


텍스트들 중에서 내가 원하는 부분을 찾는 방법은 키워드로 검색하는 것이 일반적입니다.

키워드 검색의 정확성은 높지만 비슷한 정보들을 찾기는 어렵다는 단점이 있습니다.

이때 이용할 수 있는 방법이 바로 Regular Expression


예시를 들어보겠습니다.

게시판에서 글의 정보를 가져오는 쿼리의 ResultSet을 클래스에 담는 경우를 생각해봅니다.

TITLE, NAME

2개의 컬럼이 있는경우는 간단합니다.



SEQ, TITLE, NAME, DATE, UPDATE_DATE

5개의 컬럼이 있는 경우? 혹은 20개가 있는 경우는 일일이 작성해야 할까요?

위의 field 선언부를 보면 알 수 있지만 여러개를 모두 작성하려니 힘이 듭니다.

이럴때는 정규표현식을 이용하면 굉장히 편리합니다.




Regular Expression 시작하기

가장 많이 사용하는 정보를 위주로 설명드리겠습니다.

정규표현식 테스트사이트로 이동하셔서 테스트 해보시기 바랍니다.


1. meta sequences

어떠한 1글자를 나타내는 키워드

 .

 라인을 변경하는 문자를 제외한 다른 문자 1개

 Matches any character other than newline (or including newline with the /s flag) 

 \s

 공백, Tab, 라인변경

 Matches any space, tab or newline character.

 \S 

 \s를 제외한 나머지 문자

 Matches anything other than a space, tab or newline.

 \d

 숫자

 Matches any decimal digit. Equivalent to [0-9].

 \w

 문자, 숫자, 밑줄(_)

 Matches any letter, number or underscore.

 

 

 

 


2. quantifiers

수량을 나타내는 키워드


 ?

 0 ~ 1

 *

 0 ~ 무한 

 +

 1 ~ 무한 

 {숫자}

 정확히 숫자 갯수 

 {숫자,}

 숫자 갯수 이상 

 {숫자1, 숫자2}

 숫자1 ~ 숫자2 갯수 사이



3. group construct

어려우면서 잘쓰면 좋은 그룹!

...은 찾을 키워드 (다른 키워드들이 들어가거나 문자 숫자 들이 들어갑니다.)

그룹을 찾고 나면 찾은 순서대로 \1, \2, \3 이런식으로 사용이 가능합니다.


 ( ... ) 

 괄호 사이를 찾고 그룹으로 지정합니다.

 (\w)

 ( a | b )

 a 또는 b

 (a|b)

 (?: ... )

 괄호 사이를 찾지만 그룹으로 지정하지 않습니다

 

 (?<name> ... )

 괄호 사이를 찾고 그룹의 이름을 name으로 지정합니다

 

 앞...(?=뒤...)

 Positive lookahead

 앞을 찾되 뒤가 같은 결과만 찾습니다

 abc(?=def)

=> abcdef abc000

 앞...(?!뒤...)

 Negative lookahead

 앞을 찾되 뒤가 다른 결과만 찾습니다

 abc(?!def)

=> abcdef abc000

 앞...(?<=뒤...)

 Positive lookbehind

 뒤를 찾되 앞이 같은 경우만 찾습니다

 abc(?<=def)

=> abcdef 123def

 앞...(?<!뒤...)

 Negative lookbehind

 뒤를 찾되 앞이 다른 경우만 찾습니다

 abc(?<!def)

=> abcdef 123def

 

 

 

 

 

 




Regular Expression 적용하기


선언부를 이용하여 아래의 결과값을 만들도록 합니다.

원하는 결과값 입니다.

첫줄을 설명하면

int 라는 타입을 찾고 변수명인 SEQ를 찾아서 getter setter를 그대로 이용하도록 하는 코드입니다.


검색

1. 먼저 변수명을 찾으려면 어떻게 해야할지 생각해봅니다

; 문자 앞에 변수명이 오고 있습니다.

[정규표현식]  (\w+);

[설명] \w라는 문자 숫자 밑줄을 한개 / + 갯수(1~무한) / ; 라인이 끝남 / 괄호 (, ) 를 통해서 그룹 설정을 합니다


2. 사이사이에 공백문자가 들어갈 수 있음을 염두해둡니다

[정규표현식]  (\w+)\s*;

[설명] \s 공백문자/ * 갯수(0~무한)



3. 데이터 타입을 찾습니다

[정규표현식]  (\w+)\s+(\w+)\s*;

[설명] 공백이 1개 이상 있으며 그앞에 데이터 타입이 있습니다. / 괄호 (, ) 를 통해서 타입에 대한 그룹 설정을 합니다


4.앞 뒤의 모든 문자들을 포함합니다.

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 데이터 타입 앞에 1개의 공백을 띄우고 / .* 나머지 문자를 앞뒤로 모두 포함합니다.


5. 대소문자 구분을 위해 \w+를 \w{1}\w* 로 변경합니다

[정규표현식]  .*\s+(\w+)\s+(\w+)\s*;.*

[설명] 함수의 대소문자를 맞추기 위해 맨 앞자리를 구분합니다



변경

원하는 부분을 모두 검색했으며, 이젠 그룹을 통해 원하는대로 변경하는 작업이 남았습니다

현재의 그룹 상태

\1 에 들어있는 값 => 데이터 타입의 첫번째 문자

\2 에 들어있는 값 => 데이터 타입의 나머지 문자

\3 에 들어있는 값 => 변수명의 첫번째 문자

\4 에 들어있는 값 => 변수명의 나머지 문자


대문자로 출력하기가 설정되어야 합니다만 텍스트 에디터마다 다른 기능을 통해 지원하고 있습니다.

예를 들어 VIM, Notepad++ 은 \U를 통해 뒤에 나온 내용 전체 대문자화, \u를 통해 뒤에 나온 내용만 대문자화를 지원하고 있습니다. 소문자의 경우는 \L \l 입니다.


article.set\u\3\4\(resultSet\.get\u\1\2\("\3\4"\)\);

Notepad++을 기준으로 설명드리기 전에 먼저 regex101.com을 이용한 결과를 보여드리겠습니다

\u 키워드를 지원하지 않고 있기 때문에 그대로 u라고 출력되었습니다.


Notepad++을 통해 변경작업을 하게 되면 다음과 같습니다.


javascript를 이용하면 결과값에서 대문자화를 추가적으로 진행해야 합니다. stackoverflow 사이트로 이동

var re = /(\b[a-z](?!\s))/g;
var s = "fort collins, croton-on-hudson, harper's ferry, coeur d'alene, o'fallon"; 
s = s.replace(re, function(x){return x.toUpperCase();});
console.log(s); // "Fort Collins, Croton-On-Hudson, Harper's Ferry, Coeur D'Alene, O'Fallon"


이런식으로 Regex를 만들어두고 필요할 때 변경하여 사용하면 화살표 Ctrl+c, Ctrl+v 노가다를 줄일 수 있습니다!

댓글 피드백을 남겨주세요↓



by 개발자가 되자! 2015. 10. 22. 13:58
| 1 2 3 4 5 6 ··· 51 |