반응형

정규식에는 많은 규칙이 있지만... 실제로 사용해 보지 않으면 그 묘미를 확인하기가 어렵죠 지금부터는 정규식을 활용해서 실제로 해볼수 있는 여러가지 작업에 대해 소개해보도록 하겠습니다.

 

먼저 시작하기 전에

https://regexper.com/

 

이사이트에서는 자신이 입력한 정규식에 대한 검증을 시각화로 도와주는 사이트 입니다. 혹시 자신이 작성한 정규식을 검증해 볼 필요가 있을때 유용하게 사용할 수 있는 사이트이니 참고해 주시고...

 

1. 핸드폰 번호

사람들이 많이 사용하는 핸드폰 번호는

형식이 010-1234-5678 이런식으로 숫자 3자리 - 4자리 - 4자리로 구성되어 있죠

 

이런 경우에는

 

1) /^\d{4}-\d{5}-\d{5}$/

 

2) /^010\-[0-9]{4}\-[0-9]{4}$/

 

2가지 경우로 표현할 수 있습니다.

 

첫번째는 10진수의 숫자 3개와 4개, 4개를 표현하는 것입니다. 물론 자유도가 다소 높죠

두번째는 앞에 010이라는 전재를 하고 각 자리수별로 가능한 범위를 지정합니다. 이때는 사용자에 따라서 특정 핸드폰을 구별해서 처리하고 싶을 때 가능한 방법입니다.

 

 

2. IP 주소

 

아이피주소는 간단하지만 예외가 많습니다

 

단순하게 ###.###.###.### 이렇게 생각하고 작성할 수 도 있습니다.

하지만  ##.##.###.## 이 경우도 있고 . 다시 말해 아까 전과는 달리 자릿수가 변동이 생길수가 있죠. 자릿수를 무조건 3자리로 정한다면 이야기는 달리지겠지만요...

 

/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

 

정규식이 첫번째로 잡아낸 그룹은 실제로 매치된(captured)된 그룹이 아닙니다. 왜냐하면 ?: 가 그안에 위치하고 있기 때문입니다. ?:는 파서가 이 그룹을 잡아내지 않도록 합니다. 또한 이 잡히지 않는 그룹은 3번 반복되기를 원합니다.(그룹의 끝에 {3}) 이 그룹은 또다른 서브그룹과 점(.)을 담고 있고 파서는 점(.)이 뒤에 있는 서브그룹을 매치하려고 찾습니다.

서브그룹은 또다른 잡히지 않는(non-captured) 그룹입니다. 이것은 0~5가 뒤에 오는 "25"거나 0~4와 모든 숫자가 뒤에 오는 "2"이거나 옵션이 0 또는 2개의 숫자가 이어지는 숫자들의 문자셋의 묶음입니다.

이 3가지가 매치된 이후에 다음 캡쳐되지 않는 그룹으로 들어갑니다. 이것은 0~5가 이어지는 "25" 또는 0~4와 함께 오는 "2" 그리고 마지막에 다른 숫자(0이나 두자리 숫자)가 옵니다.

마지막 문자($)와 함께 이 복잡한 정규표현식이 끝납니다.

 

 

 

 3. URL

 

URL을 보는 방법에대해 알아보겠습니다.

 

URL을 수식으로 한번 풀어 보면

 

http[s]://XXXX.XXX/XXX 이런식으로 할 수가 있겠죠

 

 

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w_\.-]*)*\/?$/

 

 

첫번째 그룹은 모두 옵션인데 이것은 URL이 "http://"나 "https://" 또는 둘다 없이 시작하도록 한다. s뒤에 물음표(?)는 URL이 http와 https를 모두 허용한다. 이 그룹전체를 선택사항으로 하기 위해서 뒤에 물음표(?)를 추가했습니다.

다음은 도메인명으로 한개이상의 숫자, 문자열, 점(.), 하이픈(-)뒤에 또다른 점(.)이 오고 그 뒤에 2~6개의 문자와 점이 옵니다. 이어지는 부분을 추가적인 파일과 디텍토리에 대한 부분으로 이 그룹에서는 갯수에 관계없이 슬래쉬(/), 문자, 숫자, 언더스코어(_), 스페이스, 점(.), 하이픈(-)이 나올 수 있으며 이 그룹은 많은 수의 디렉토리와 파일과 매치됩니다. 물음표(?)대신 별표(*)를 사용한 것은 별표는 0 또는 1이 아닌 0 또는 1개이상을 의미하기 때문입니다. 만약 물음표(?)를 사용했다면 오직 한개의 파일/디렉토리만 매치될 수 있었을 것입니다.

그 뒤에 슬래시(/) 매치되지만 이것은 선택사항이며 마지막으로 문자열의 끝($)이 나타납니다.

 

 

 

반응형
반응형

쉘 스크립트에서 문자열을 다루기 위해서는 awk, cut, grep의 기본 명령어만으로도 충분하지만, 보다 코드를 간결하게 작성하고 싶고 복잡한 미션을 수행하기 위해서는 정규표현식이 필요합니다.

 

물론, 제 생각에는 정규표현식은 필요악??? 이라고 생각되는 측면이 많이 있습니다. 일단 프로그램언어나 시스템 별로 차이점도 존재하고 쓰는 사람만다 다양한 방법으로 사용이 가능하고 제일 중요한 점은 가독성이 떨어지기 때문에 추후 유지보수 측면에서도 떨어지는 단점이 있습니다.

 

그렇지만 정규표현식은 감히 말하건데... MSG같은 마법으로 우리에게 다가오기 때문에 문자열 관련 측면이 아니더라도 알아두면 좋을거 같습니다.

 

표현식(expression)이란 문자 그대로의 의미 이상으로 해석되는 메타문자(metacharacters)라고 부르는 문자들의 집합을 말합니다.

 

예를 들어, 인용 부호(quote symbol)는 어떤 사람이 말한 것을 나타내 주기도 하지만 또한 그 뒤에 나오는 심볼에 대해서 메타적 의미를 부여하기도 합니다. 정규 표현식은 유닉스에 특별한 특징을 부여하는 문자들과 메타문자들의 집합입니다.

 

정규 표현식은 주로 텍스트 탐색과 문자열 조작에 쓰입니다. 정규 표현식은 하나의 문자와 일치(match)하거나, 혹은 문자열의 일부분(substring)이나 전체 문자열인 문자 집합들과 일치하게 됩니다.

 

<기초>

 

1. 별표(*)는 바로 앞의 문자열이나 정규 표현식에서 0개 이상 반복되는 문자를 나타냅니다.

"113*" 은 11 + 하나 이상의 3 + 가능한 다른 문자들 을 나타냅니다: 113, 1133, 11312, 기타 등등.

 

2. 점(.)은 뉴라인을 제외한 오직 한 개의 글자와 일치합니다.

"13." 은 13 + 빈칸을 포함한 최소 한 글자 를 나타냅니다: 1133, 11333, 하지만 13은 뒤에 한 글자가 빠져 있기 때문에 아닙니다.

 

3. 캐럿(^)은 줄의 시작을 나타내지만 가끔 문맥에 따라서는 정규 표현식에서 문자 집합의 의미를 반대로 해석해 줍니다.


4. 정규 표현식의 제일 끝에 나오는 달러 표시($)는 줄 끝과 일치합니다.

"^$" 는 빈 줄과 일치합니다.

 

5. 대괄호([...])는 단일 정규 표현식에서 표현하기 위해 문자들을 집합으로 묶어 줍니다.

"[xyz]" 는 x, y, z 중에 한 글자와 일치합니다.

"[c-n]" 는 c에서 n 사이에 들어 있는 한 문자와 일치합니다.

"[B-Pk-y]" 는 B에서 P까지 중이나 k에서 y까지 중의 한 글자와 일치합니다.

"[a-z0-9]" 는 소문자나 숫자중의 한 문자와 일치합니다.

"[^b-d]" 는 b에서 d사이의 문자를 제외한 모든 문자를 나타냅니다. ^은 바로 뒤에 나오는 정규 표현식의 의미를 반대로 해석하게 해 줍니다(다른 문맥에서 !의 의미와 비슷함).

여러개의 대괄호로 묶인 문자들은 일반적인 낱말 패턴을 나타냅니다. "[Yy][Ee][Ss]"는 yes, Yes, YES, yEs, 등등을 나타냅니다. "[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"는 주민등록번호와 일치합니다.

 

6. 역슬래쉬(\)는 특수 문자를 원래의 문자 의미대로 해석하게 해줍니다(escape).

"\$" 는 정규 표현식에서 줄 끝(end-of-line)을 나타내는 의미대신 "$" 문자 그대로 해석하게 해줍니다. 비슷하게 "\\"는 그냥 "\" 문자 그 자체를 나타냅니다.

 

 

<메타 문자 정리>

 

1) ^ : 문자열의 처음을 나타냄

맞는 문자열
^group group으로 시작하는 문자열 group, groups, group program, …

 

2) $ : 문자열의 끝을 나타냄

맞는 문자열
ing$ ing로 끝나는 문자열 ing, sing, hosting, booting, …
^code$ code로 시작하고 끝남 code

3) . : 임의의 한문자를 나타냄

맞는 문자열
a.b a와 b 사이에 한 문자가 낀 문자열 aab, abb, acb, …
ab. ab 다음에 한 문자가 붙은 문자열 aba, abb, abc, …
a..b a와 b 사이에 두 문자가 낀 문자열 a11a, aabb, abbb, …
^.ape ape 앞에 한 문자가 낀 문자열로 시작함 tape, caper, …


 

4) * : 바로앞의 문자가 없거나 하나 이상이 있는 겅유

맞는 문자열
m*r r 앞에 m이 없거나 하나 이상 있음 r, mr, mmr, mmmr, …
mr*s m 다음에 r이 없거나 하나 이상 있고 s가 맨 뒤에 있음 ms, mrs, mrrs, mrrrs, …
mrs* mr 다음에 s가 없거나 하나 이상 있음 mr, mrs, mrss, mrsss, …
5) + : 바로 앞의 문자가 하나 이상 있음
맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
6) ? : 앞의 문자가 없거나 하나임

 

맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
7) [] (꺽쇠묶음, 대괄호):

  - 꺼꾀묶음은 한 문자를 가리킴

  - 묶음안의 내용은 가리키는 문자의 범위를 나타냄

    (문자 클래스로서 정규 표현식과는 언어가 다름)

  - 특정한 문자열을 제외하려면 묶음안에 '^'를 사용

맞는 문자열
[w]s s 앞에 w가 붙음 ws
[ws]p p 앞에 w나 s가 붙음 wp, sp
[a-z]8 8 앞에 잔 로마자(소문자) 하나가 붙음 a8, b8, c8, … , z8
[a-zA-z][0-9] 로마자 하나 뒤에 숫자 하나가 붙음 a0, b5, K3, …
[^w]s s 바로 앞에 w가 아닌 문자 하나가 붙음 as, 2s, es, …
[^ws]p p 바로 앞에 w나 s가 아닌 문자 하나가 붙음 ap, hp, op, …
[^a-z]8 8 바로 앞에 잔 로마자가 아닌 문자 하나가 붙음 A8, C8, 38, #8, …
^[^gh][^ij]$ g나 h가 아닌 한 문자로 시작하고  i나 j가 아닌 한 문자로 끝남
(꺾쇠묶음 밖의 ^는 문자열의 처음을 나타냄)
ab, ty, ig, jh, …

8) { } : 중괄호

  - 중괄호는 앞에 있는 문자의 개수를 나타냄

  - 묶음안에서 ' , '는  문자 개수의 범위를 나타낼때 씀

맞는 문자열
w{0}s s 앞에 w가 없음 s
w{1}s s 앞에 w가 하나 붙음 ws
ws{3}p w가 앞에 오고 s가 셋 붙으면서 p가 뒤에 붙음 wsssp
w{1,3}s s 앞에 w가 1~3개 붙음 ws, wws, wwws
w{,2}s s 앞에 w가 두 개 이하 붙음 s, ws, wws
w{2,}s s 앞에 w가 두 개 이상 붙음 wss, wsss, …

9) | : 또는 / or와 같은 선택문에 사용

맞는 문자열
word|phrase word 또는 phrase word, phrase
mount(ed|ing) mounted 또는 mounting mounted, mounting
[^(a|b|c)].+ a 또는 b 또는 c로 시작하지 않는 문자열  

10) \(거꿀빗금) : 메터문자의 성분을 없앨때 사용

맞는 문자열 안 맞는 문자열
\[[^\[\]]+\] 꺾쇠묶음으로 한 겹만 싸인 문자열 [a], [ab], [abc], … [], [[abcd]], [a[]], …
[^\.]+\.(com|net) com, net로 끝나는 바탕 도메인 이름
(서브 도메인이 아닌 것)
a.com, b.net, … b.a.com, .a.com, .net …

반응형

+ Recent posts