[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 정규표현식인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정규표현식인 게시물을 표시합니다. 모든 게시물 표시

2016년 3월 21일 월요일

[Book] 한 권으로 끝내는 정규표현식..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

한 권으로 끝내는 정규표현식
잰 고이바에르츠, 스티븐 리바이선 저
김지원 역
한빛미디어

책 제목은 잘 지었다고 생각하고 있습니다. 책을 처음 받고 약간 놀랐는데 자그만치 600페이지나 되는 두꺼운 책이었기 때문인데 정규표현식이 만만한다거나 쉬운거라고 생각하진 않지만 자그만치 600페이지라니 읽기도 전에 확실히 한권으로 끝나겠다는 생각을 들 정도였습니다.

이 책은 정규표현식의 모든 것을 다 다룬다고 할정도로 많은 내용을 다루고 있습니다만 정규표현식 자체가 좀 그러하듯이 각 문법에 대한 설명이 기본적으로 있고 책이 전체적인 구성이 정규표현식으로 해결할 어떤 문제를 주고 그 문제를 해결할 정규표현식을 보여주고 그에 대한 설명이 이어붙는 구성으로 처음부터 끝까지 이루어져 있습니다. 그렇다 보니 책을 읽으면서 오르고내리는 굴곡이 별로 없기 때문에 그냥 보기에는 상당히 지루하다고 할 수 있습니다. 딱히 정규표현식을 엄청나게 익혀야 한다거나 하는 등의 이유가 아니라면 이 책을 처음부터 차근차근 공부한 다른 것은 좀 어려운 일이 아닐까하는 생각이 들었습니다.

그보다는 이 책은 정규표현식에 대한 레퍼런스 북에 가깝습니다. 특히 이 책은 많은 언어별로 정규표현식을 설명하고 있습니다. C#, VB.NET, Java, JavaScript, PHP, Perl, Python, Ruby을 중심으로 각 언어별의 차이점을 일일이 짚어주고 있기 때문에 이 책을 차근차근 공부한다기 보다는 정규표현식이 필요할때 찾아보면서 사용중인 언어의 특징을 파악하면서 참고용으로 사용하는 것이 더 적합하다고 생각합니다. 단순히 정규표현식에 대한 사용법을 잘 모른다거나 좀 더 알고 싶어서 공부하려는 의도라면 이 책보다는 200페이지도 안되는 손에 잡히는 정규표현식이 더 적합한 책이라고 생각하고 있습니다.

각 언어별로 정규표현식의 차이가 있지만 일반적으로 이러한 부분을 외우고 있는 사람은 많지 않고 필요할때마다 검색하는 수밖에 없는데 HTML파싱, URL, 이메일, 전화번호 매칭 등의 실용적으로 쓰일 만한 예제들을 위주로 설명되어 있으며 중반부부터는 정규식 뿐만 아니라 각 언어에서 어떻게 사용해야 하는지 코드까지 담고 있기 때문에 틈틈히 참고하면서 보기에는 상당히 좋다고 생각합니다. 기초부터 차근차근 설명한다기 보다는 정규식의 특성 및 각 언어별의 차이점에 중점을 두고 있는 느낌이기에 정규표현식을 잘 모른다면 약간 어려울 수도 있습니다.


2016년 3월 10일 목요일

[Book] 손에 잡히는 정규표현식..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

손에 잡히는 정규표현식 - 8점
벤 포터 지음, 김경수 옮김/인사이트

개발을 할 때 정규표현식(Regular Expression)의 유용함은 따로 설명하지 않아도 충분할 것 같습니다. 간단한 것은 그냥도 처리가 가능하지만 조금만 복잡해지면 정규표현식의 강력함이 드러나게 되고 나중에는 정규식만 잘 써도 왠만한 텍스트처리는 자유자재로 다룰 수 있습니다.

그럼에도 정규표현식은 따로 공부를 잘 안하게 되는 경향을 띄게 됩니다.(저만 그런지 모르겠지만요...) 개발자로써 공부해야 될 기술들이 산더미같은 마당에 정규표현식에 많은 투자를 잘 안하게 되고 간단한 학습후에는 소위 구글링으로 필요한 정규표현식의 상당수는 얻어낼 수 있기 때문에 한번 공부해야지 하면서도 잘 안되게 되는 것 중 하나입니다.

그런 면에서 이 "손에 잡히는 정규표현식"은 딱 적당한 책입니다. 국내에는 정규표현식에 대한 책이 이책 외에 "정규표현식 완전 해부와 실습"이라는 책이 있습니다만 이 책은 600페이지나 되기 때문에 정규표현식의 도사가 될것도 아닌데 학습하기에 좀 부담스러운 면이 있는데 "손에 잡히는 정규표현식"은150여 페이지 정도로 " Regular Expressions in 10 minutes"라는 제목처럼 부담없는 책입니다. 제목처럼 10분안에 공부할 수는 없겠지만 좀 집중해서 보면 몇시간 정도면 다 볼만한 분량의 책입니다.

그럼에도 내용이 가볍지 않고 문자 찾기부터 시작해서 메타문자 사용하기, 반복찾기, 위치찾기, 하위표현식등 아주 기초적인 내용부터해서 일일이 예제를 보여주면서 설명하고 있으며 가끔 정규표현식을 쓰면서도 전혀 몰랐던 전방/후방 탐색이라든지 조건달기같은 고급까지 모두 설명해 주고 있습니다. 이 책에 나온대로 정규표현식에는 정답이 없고 문법을 알았고 설명이 명확해서 각 기능을 이해하는데 어렵지 않기 때문에 그 이상으로는 각자 연습하면서 익히면 충분할 것으로 보입니다.

부록으로 대표적인 정규식을 예시로 보여주고 있고(미국판이라 저희는 좀 필요없는 것들도 있지만요.) 언어별로의 정규표현식의 차이도 설명해 주고 있어서 정규표현식에 대해서 공부는 하고 싶지만 많은 노력을 들이는 것은 좀 부담스러운 사람들에게 딱 적당한 책인듯 합니다.


My Comment..
정규식을 알고는 있지만, 아니 안다라기보다 인지는 하고 있지만 쓰기시작한건 얼마 안된다.. 다른 곳보다 특히 비밀번호 정책에 적용할 때 정규식만한게 없는 듯하다.. 이리 돌리고 저리 돌리고 할 소스가 정규식 한줄로 끝나기 때문이다..[물론 그에 수반되는 코딩은 추가 될지언정.. 일반 코딩보다는 줄어든다..] 그런점에서는 햄 말대로 공부하긴 해야되지만, 대부분 naver 누님이나 google 에서 찾아서 약간식 변형을 해서 쓰게 되는듯하다.. ㅎㅎ..

2016년 3월 3일 목요일

[DEV]알고 있어야 할 8가지 정규식 표현 from nettuts+..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

nettuts+에 Vasili이 쓴 유용한 정규식 표현에 대한 글을 올려서 내용 정리합니다. 정규식만 잘 써도 Validation이나 String을 다루기가 무척 편할텐데 쓸때마다 헷갈리고 약간은 어렵게 느껴지고 쉽게 다가가지지 않는게 정규식인것 같습니다.

Vasili는 정규식에 대해서 잘 모르면
Regular Expressions for Dummies 스크린캐스트 시리즈를 보기 권하고 있습니다. 시간내서 보면 꽤 도움이 될듯 합니다. 자리 잡고 스크린캐스트 보게는 잘 안되는것 같습니다. 글을 읽어도... ㅎㅎ

정규표현식을 공부해도 막상 적용하려면 약간 막막하고 헷갈리기 마련인데 웹개발할 때 보통 많이 사용할 만한 내용을 위주로 설명해 주었기 때문에 이해하기도 쉽고 활용해서 쓰기에 꽤나 유용할 듯 보입니다. (위에도 간단히 밝혔지만 nettuts+의 올라온 포스팅을 번역,정리한 내용입니다.) 간단한 정규표현식 문법은
전에 올린 포스팅을 참고하시면 될 것 같습니다.

Matching a Username

사용자 삽입 이미지
C-like

1
2
// Pattern
/^[a-z0-9_-]{3,16}$/

문자열의 시작부분을 찾는 ^ 다음에 소문자(a-z)나 숫자(0-9), 언더스코어(_), 하이픈(-)가 나올 수 있고 {3, 16}은 앞의 캐릭터들( [a-z0-9_-] )이 최소 3개에서 15개 이하로 나와야 하고 문자열의 끝을 의미하는 $가 마지막에 나옵니다.

Match되는 스트링 : my-us3r_n4m3
Match되지 않는 문자열 : th1s1s-wayt00_l0ngt0beausername   (너무 김)

Matching a Password
사용자 삽입 이미지


C-like

1
2
// Pattern
/^[a-z0-9_-]{6,18}$/

username부분과 아주 유사합니다만 유일하게 다른 부분은 글자수가 3~16자가 아니라 6~18자라는 부분( {6,18} )입니다.

Match되는 스트링 : myp4ssw0rd
Match되지 않는 문자열 : mypa$$w0rd   (달러($)표시가 포함되어 있음)

Matching a Hex value
사용자 삽입 이미지


C-like

1
2
// Pattern
/^#?([a-f0-9]{6}|[a-f0-9]{3})$/

이번에서 문자열의 시작을 찾는 ^로 시작합니다. 그 다음 number sign(#)은 뒤에 물음표(?)가 있기 때문에 옵션입니다. 물음표(?)는 그 앞에 나온 캐릭터가(여기서는 number sign)이 선택사항(있어도 되고 없어도 되는)임을 의미합니다. 그 다음에 나오는 그룹(괄호 안에 있는)에서 2가지 경우를 가질 수 있습니다. 첫번째는 a와 f사이의 소문자나 숫자가 6번나오는 것입니다. 세로바(|)는 3개의 a와 f사이의 소문자나 숫자가 대신 나올수도 있음을 으미합니다. 마지막으로 문자열의 끝을 의미하는 $가 위치합니다.

6개의 문자열을 앞에 둔 이유는 #ffffff같은 Hex값을 파서가 잡아내도록 하기 위한 것으로 반대로 3개의 문자열 검사를 앞에 두었다면  파서는 뒤의 3개의 f는 빼로 오직 #fff만을 잡아냈을 것입니다.

Match되는 스트링 : #a3c113
Match되지 않는 문자열 : #4d82h4   (h 가 포함되어 있음)

Matching a Slug
사용자 삽입 이미지

C-like

1
2
// Pattern
/^[a-z0-9-]+$/

mod_rewrite나 pretty URL을 사용해 본적이 있다면 이 정규표현식을 사용하게 될 것입니다. 시작 문자열인 ^가 처음에 나오고 뒤이어 소문자, 숫자, 하이픈(-)이 한개 또는 한개이상(+기호)나오고 마지막으로 문자열의 끝인 $가 나옵니다.

Match되는 스트링 : my-title-here
Match되지 않는 문자열 : my_title_here   (언더스코어( _ ) 가 포함되어 있음)

Matching an Email

사용자 삽입 이미지

C-like

1
2
3
// Pattern

/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/

문자열의 시작인 ^로 시작하고 첫번째 그룹(괄호 안)에서 1개 또는 그 이상의 소문자, 숫자, 언더스코어( _ ), 점(.), 하이픈(-)가 나옵니다. escape하지 않은 점(.)은 다른  문자를 의미하기 때문에 점(.)은 이스케이프 해줍니다.(\.) 그 뒤에 앳 기호(@)가 나오고 그 다음 1개또는 그 이상의 소문자, 숫자, 언더스코어( _ ), 점(.), 하이픈(-)으로 구성된 도메인명이 옵고 그 후 점(이스케이프된)이 소문자와 점으로 된 2~6개의 문자열이 옵니다. 2~6개로 한 이유는 .co.kr이나 .ny.us같은 국가 TLD(Top-Level-Domain)때문이며 마지막으로 문자열의 끝($)인 옵니다.

Match되는 스트링 : john@doe.com
Match되지 않는 문자열 : john@doe.something   (TLS가 너무 김)

Matching a URL

사용자 삽입 이미지


C-like

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

이 정규표현식은 위에 나온 정규표현식의 최종본이라고 할 수 있습니다.

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

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

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

Match되는 스트링 : http://net.tutsplus.com/about
Match되지 않는 문자열 : http://google.com/some/file!.html    (느낌표가 포함되어 있음)

Matching an IP Address
사용자 삽입 이미지


C-like

1
2
3
// Pattern

/^(?:(?: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]?)$/

자, 저는 거짓말을 하지 않습니다. 이 정규표현식은 제가(Vasili) 작성하지 않았고 이곳에서 가져왔습니다.

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

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

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

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

Match되는 스트링 : 73.60.124.136
Match되지 않는 문자열 : 256.60.124.136    (첫번째 숫자는 250~255이어야 함)

Matching an HTML Tag
사용자 삽입 이미지


C-like

1
2
// Pattern
/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/

이 포스팅에서 가장 유용한 정규표현식 중의 하나입니다. 이것은 어떤 HTML태그도 매치할 수 있고 일반적으로 라인의 첫번째에서 시작합니다.

첫번째로 오는 것은 태그이름입니다. 이것은 반드시 한개이상의 문자가 되어야 하며 첫번째로 잡히는 그룹이기도 합니다. 이것은 닫는태그를 잡았을 때 찾아야 할 값입니다. 다음에는 태그의 속성입니다. 이것은 >를 제외한 어떤 문자도 올 수 있습니다. 옵션사항이지만 1개이상의 캐릭터와 매치되기를 원하기 때문에 별표가 사용되었습니다. 플러스기호는 속성과 값을 이루고 별표는 원하는 만큼의 속성(attribute)가 매치될 수 있도록 합니다.

다음으로 세번째 non-capture그룹이 오는데 내부에 >기호가 담길 것이고 컨텐츠부분과 닫는태그가 있습니다.(공백과 슬래시(/), > 기호) 첫옵션은 문자들에 이어지는 >기호를 찾습니다. \1은 캡쳐된 첫번째 그룹에서의 내용을 표현하는데 사용됩니다. 이 경우에는 태그의 이름이 됩니다. 이제 태그이름이 매치되지 않으면 자신의 닫는태그를 찾기를 원합니다. 이것은 "/>"가 이어지는 한개이상의 공백이 필요합니다.

Match되는 스트링 : <a href="http://net.tutsplus.com/">Nettuts+</a>
Match되지 않는 문자열 : <img src="img.jpg" alt="My image>" />    (속성은 >기호를 가질 수 없음)

내용은 아주 좋은데 급하게 작성했더니 번역이 영 그렇네요. 원문가서 보시길....(은근슬쩍 급하게 해서 번역이 이런 척... ㄷㄷㄷ)

2016년 2월 12일 금요일

[JS]정규식(Regular Expression) 대충 정리..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

정규식은 학생때도 배웠고 가끔 접하긴 하는데 할때마다 어려운것 같다. 학생때는 아~ 이런거구나 한적도 있는것 같은데 코딩할려고 하면 막상 매칭시킬려고 하면 왜 이렇게 어려운건지.... 할때마다 찾아야 되고.... 정규식만 자유자재로 써도 내공이 한갑자는 상승할것 같다는 생각도 하지만... 그렇다고 막상 따로 공부는 잘 안되고....

자바스크립트에서는(여기서만 이런건지 잘 모르겠지만...) 정규식을 /.../로 묶어준다.

var pattern = /rules/;

식으로 써주면 된다.

^ : 시작표시(매칭이 처음부터 되어야 함)
$ : 끝표시(문자열 끝에 매칭되어야 함)
[] : 문자열 셋
      [ab][a-z][0-9] 라고 써주면 첫글자는 a또는 b이고 그 다음에 a~z가 나오고 그 뒤에 0~9가 나온다는 뜻..
      []안에서 ^쓰면 그 문자가 아닌것들
* : 0번 이상 반복
+ : 1번 이상 반복
? : 0 또는 1회
{} : 횟수 표시
      [a]{2}이면 aa이고 [a]{2,}이면 a가 2개 이상인거 [a]{2, 4}이면 aa, aaa, aaaa 이다.
\d : 숫자, [0-9]와 같음
\D : 숫자가 아닌 것들 [^0-9]와 같음
| : Or의 뜻
{} : 그룹을 묶어 준다.
. : 뉴라인(\n)제외한 한 문자 (진짜 .을 찍기 위해선 \.으로 표시해야 한다.)

더 자세한 문법은  Wikipedia 참고

옵션 /rules/ig 와 같이 써준다.

g : 글로벌의 뜻. 전역 매칭을 한다. 처음부터가 아닌 전체에서 정규식이 맞는걸 찾는다.
i : case Insensitive, 대소문자 구별안함
m : Multiline



정규식 테스트 사이트

덧) 특수문자를 매칭시켜주려면 \\를 사용한다. \\. 이나 \\| 처럼....

My Comment..
BCCard 에서도 정규식 때문에 여러번 애를 먹은 기억이..
항상 인터넷에서 찾아보거나.. 남들이 해둔 것을 토대로 검색을 해서..
추가 수정을 하곤 한다.. 모든 것이 그렇지만 항상 좋다거나 나쁘다거나 할 수는 없지만..
그래도 쓰면, 코드로 했을 때보다 확 줄어들 때도 있어서.. 종종 쓰게 된다능..