정규표현식 연습하기(마침표, \n, [a-z 등])

Posted by ITPangPang
2016. 9. 3. 16:16 기타/Regular Expression


정규표현식 연습하기

(마침표, \n, [a-z 등])



이번에는 앞에 살짝 공부한것과 +를 포함해서

    연습을 해보는 글을 써보겠습니다.


ㆍ 이게 참 정규표현식이 배우는건 어려운건 아닌데

    적용하는게 너무 힘든것 같습니다.


ㆍ 개발을 하면서 문자열처리를 어떻게 하느냐에 따라

    코드의 길이차이가 엄청난데 무한연습을 통해서

    깔끔하게 짤 수 있도록 해야됩니다.


ㆍ 저도 역시 문자열처리가 너무 약해서 정규식을 제대로 파야할것 같습니다



이전글들에서 살짝 봤던

마침표(.), \b(바운더리), 

[a-z A-Z 0-9]등을 이용해서

연습해보도록 하겠습니다


그냥 머리속으로 상황을

만들어보려고 하는데

혹시 틀릴 수도 있는데

보시다가 틀린부분이 있으면

알려주시면 감사하겠습니다


오늘도 역시나

항상 감사한


http://regexr.com/

사이트의 도움을 받겠습니다


저는 자바위주로 개발을

하다보니 다른 언어들의

상황을 정확하게는 모르나


서버에서 값을 받던

사용자에게 문자열을 받던

처리하는 방법은 다양할 겁니다


Json으로 받거나 또는 긴 장문의 문자열을 받아서

String tokenizer를 통해서 분리한 후에 

분리한 값을 배열이든 리스트든 맵이든

add를 해서 관리 할텐데

(자바기준..)



첫번째로 연습하게 될 상황은

파일을 받았는데

html 파일만 match시켜서

가져오는 방법을 알아보겠습니다


이렇게 총 12개의 파일에서

우리 찾아야 되는 파일은


aaa.html

bbb.html

ddd.html

1.html

itit.html 


이렇게 5개의 파일만

일치시켜야 할 것 같습니다


정규식을 어떻게 넣어될까요?

그냥 간단하게 .html이라고

쓰면 될까요?


.html


언뜻보면 .html 파일이

잘 분리된 것 같습니다.

(정확한 일치는 아니지만)


하지만 위에서 5개였는데

6개가 찾아졌습니다.


b.hhtml이라는 파일이

같이 포함되었습니다


이유는 .(마침표)가 모든글자

1글자이기 때문에 .(h)html

마침표가 h를 찾아서 (h)html를

찾아서 match 시키게 되었습니다


이걸 해결하기 위해서

.(마침표)를 문자열 .(마침표)로

인식하게 하기 위해서

\. 역슬래시(마침표)로 넣어보겠습니다


\.html


자 이런식으로 바꾸니

.hhtml을 잘 제외시켜주었습니다


100%일치는 아니지만 그래도

.html 앞에 문자열을 모두 날려버린후에

비교하면 원하는대로 html파일만

잘 얻어올 수 있을것이라

생각되지만!


한가지 빼먹은 부분이 또 있습니다

이런식으로 적용시킨후에

프로그램을 돌려보면

원하는 결과를 못 얻게 됩니다



이런식으로 파일이 넘어올 가능성을

생각 못했던 것입니다.

위에 표현식은 앞의 .html만 찾았을뿐

.html~~~까지 제외시키지 못했습니다

위 그림에서 보면 아래 2가지파일도

포함되게 됩니다.


이를 해결하기 위해서는

처음글에서 봤던

\b를 써주시면 됩니다


아래와 같이 써주면

해결이 될 것 같습니다.


\.html\b


자 이렇게 표현식은

이런식으로

넣어주고 조금 처리를 해주면

원하는 결과를 얻어 올 수 있으나


조금 더 작업을 단축시키기 위해

100%일치시켜보도록 하겠습니다


.html 기준 앞에 문자열도

전부다 찾을 수 있도록

표현식을 바꿔보겠습니다


위의 조건을 만족시키기 위해서는

2번째 글에서 사용했던

[a-z A-Z 0-9]를 사용하면

될 것같습니다


그리고 글에서 쓰지 않았던

+(플러스)를 포함시키겠습니다



[a-z A-Z 0-9] 

는 이전글에서 적었듯이

[a-z]모든 소문자

[A-Z]모든 대문자

[0-9]모든 숫자

를 찾으라는 의미이고


이번에 새로 +(플러스)를 넣게되었는데

플러스는 한글자 이상을 찾게 될때

쓰는 문자입니다


해석해보면 한글자 이상의 모든 문자열 

+ .html 에 만족하는 문자열을 전부

match 시켜라 라는 정도가 되겠죠?


자 과연 위의 표현식으로 100%

모든 html파일을 일치시킬 수 있을까요?


정답은 No!

빼먹은게 있습니다.


No! 이기 때문에 위에 

한글자 이상의 모든 문자열

이란 말은 틀린것이 되겠죠


빼먹은 부분은 바로


특수문자까지

생각하지 못했습니다..


파일에 특수문자도 넣을수 있죠

해결방법은 간단합니다

[] 대괄호 안에 추가시켜주면 됩니다



이런식으로 넣어주면

아래 썼던 모든 특수문자는

포함됩니다.


제가 파일에 입력가능한

특수문자는 확인 못해서

한번 확인해보니


이런 특수문자들은 포함을 시킬 수 없다고 합니다


자 그럼 키보드에서 입력이 가능한 모든 특수문자에서 

위에 특수문자를 제외하면 되겠죠?


키보드에서 입력 가능한 특수문자

`~!@#$%^&*()-_=+\|[]{};:'",.<>/?


파일에 들어 갈 수 없는 특수문자

\/:*?"<>|


결론적으로 파일에 들어갈수 있!는 특수문자

`~!@#$%^&()-_=+|[]{};',.


위의 문자열을 복사한후에 넣으면 되겠죠?


자 그냥 넘어가시지 마시고

한번만 위의 사진을 자세히 봐주세요


복붙이 끝이 아니라 한가지 더 처리!

[] 대괄호들은 앞에 \역슬래쉬 처리

해주어야 특수문자 자체로 인식됩니다


자 그럼 이제 완벽하게

,html 파일 처리를 한걸까요?


ㅠㅠ

사실 마지막으로 한가지만 더

보자면


원래 위의 대괄호 처리할때

모두 붙여서 처리가 가능합니다


이런식으로 모두 붙여서 처리하는데

위에서는 시각적으로 구분하기 위해서

공백을 뒀었는데


위에 처럼 붙였을때 한가지더

문제가 생기게 됩니다


그 문제점은


파일에 띄어쓰기!

가 가능하다는

점입니다...


해결방법은 역시

위에처럼 스페이스까지

포함시키면 되겠죠?


표현식 끝에 스페이스를

하나 추가해줬습니다.


자 이렇게 써주시면 완성된 것 같습니다

html 파일을 match시키는

최종 표현식은

[a-zA-Z0-9`~!@#$%^&()-_=+|\[\]{};',. ]+\.html\b 


정도가 될 것 같습니다

(제발 틀린부분이 있으면 알려주세요 ㅠㅠ

제 머릿속의 한계는 여기라

더이상의 예외가 생각이 안나서)


물론 위와 다른 표현식으로도

똑같이 일치시킬수도 있습니다


아직 글을 안썼지만

\w(다음글에서 설명)

\W(다음글에서 설명)

\d ([0-9]랑 같은 의미)

\D란 것도 있고([^0-9]랑 같은 의미)


등등 같은 의미이거나 좀 더 효율적인

메타문자가 있습니다


이것으로 첫번째

연습상황을 마치도록

하겠습니다


사실 이번글에서

몇가지 연습상황을

만들어서 써보려고 했는데


이런 간단한 것도

생각해야될 부분이 굉장히

많더라구요..


가장 좋은건 인터넷에

사람들이 짜서 모아놓은

정확한 표현식을 가져다가

쓰는것이 좋겠으나..


이런식으로 맨땅에 헤딩을

해보면서 익힌후에 가져다가

쓴다면 더욱더 효율적으로

사용하고 조건이 좀 달라지더라도

쉽게 적용시킬 수 있을거라 생각됩니다


(저도 .html 파일 일치시키는 표현식을 찾아보진 않았지만.. 나중에 프로젝트에서 쓰게 된다면

찾아봐야할 것 같습니다.. 틀릴수도 있으니..)


도움사이트 : http://regexr.com/


* 해당글에서 문제가 되는 부분이 있다면 즉시 삭제하겠습니다