본문 바로가기
PHP/생활코딩

5/26 생활코딩

by SKim입니다 2020. 5. 27.

* 오늘의 진도

 정규표현식

  정규표현식 패턴들

 

정규표현식: 문자를 처리하기 위한 일종의 언어

 

http://zvon.org/comp/r/tut-Regexp.html#Pages~Contents

 

Regular Expressions Tutorial @ZVON.org

 

zvon.org

 

 

정규표현식의 가장 기본적인 문법은

찾고자하는 텍스트를 그대로 적어주는 것이다.

☆ 대소문자 구분 (case senstitive)

 

☆띄어쓰기, tab, 줄바꿈도 구분

 

찾고자하는 문자열의 위치 지정하기

☆^(캐럿) - 줄의 시작

☆$ - 줄의 마지막

 

^와 $가 소스에 포함되어 있다면?

Case1) 예제의 의도는: $라는 문자로 시작되는 텍스트를 찾겠다.

 그런데 작동하지 않는 이유는? $가 특수한 기호이기 때문

 

Case2) 앞에 \를 붙여주면 그 뒤에 따라오는 문자를,

 정규표현식에서 의미가 있는 문법적인 요소가 아니라

 단순한 문자로 바꿔주는 역할을 한다. (escape) \^도 마찬가지

 

 

Case3) Case1을 성공하는 방법. 

 

Case4) \$는 문자 $이고, 그 뒤에 $는 그냥 $이기 때문에 줄의 마지막을 의미한다.

 

Case5) \\ \를 escape해준다.

 

 

우리가 원하는 대상이 정확하지 않은 경우.

☆.은 어떠한 문자/공백/특수문자건 모든 것들을 가리킨다.

와일드카드 같은 역할.

 

 

escape

 

 

 

우리가 원하는 문자의 후보군을 지정하는 방법 - [ ] (대괄호) 이용

[oyu]는 하나의 덩어리로 캐릭터, 즉 문자 하나에 해당된다.

 그래서 [dH].라고 하면 [dH]가 문자 하나, .이 문자 하나가 돼서

두 개의 문자를 의미하게 된다.

 

순서는 바뀌면 안 된다.

 

^의 다른 의미

 ^을 [ ] 안에서 사용하면 not(부정)의 의미이다.

 

서브패턴

☆ ( )를 사용, Shift+\ = |

 

 

★ 수량자(Quantifier) - 어떠한 패턴이 얼만큼 등장하는가

Case1) *는 0~여러개를 뜻한다. (0~多)

 즉, b 앞에 a가 하나만 있을 수도 있고, 여러개 있을 수도 있고, 없을 수도 있다. 

Case2) +는 1개~ 여러개를 뜻한다. (1~多)

Case3) ?는 없거나 하나를 뜻한다. (0~1)

 

 

Caes1) .*는 모든 텍스트를 뜻한다.

Case2) - 앞에 A가 하나일 수도 있고, 여러개일 수도 있고, 없을 수도 있다는 것이다.

 그 앞에는 꼭 -가 있어야 한다.

Case3) [ ] 는 선택의 후보군을 지정한다. - or @ 둘 중 하나만 있다면 선택되는 것이고,

 *는 그것이 하나일 수도 있고, 여러개일 수도 있고, 없을 수도 있다는 것이다.

 

 

Case1) \는 escape, +는 하나 이상

Case2) 앞과 뒤는 반드시 -여야 하고, @는 하나 이상 있어야 한다.

Case3) [ ] 안에서 ^는 부정이다. 공백이 아닌 것이 하나 이상 있는 것.

 

Case1) -  X0~1개  X X0~1개  X  → -X2~4개

Case2) -  @0~1개  @0~1개  @0~1개  -  →  -@0~3개-

 

 

원하는 수량을 정확하게 지정하는 방법

이 때 { } 중괄호를 사용한다.

그리고 그 안에 어떤 값이 오는데, 그 값이 수량을 의미하게 된다.

Case1) .은 어떤 문자도 상관 없다는 뜻이다. {5}가 바로 수량자이다.

 어떠한 문자건 간에 5글자여야 한다는 뜻이다.

Case2) [els]는 e나 l이나 s 중 한 글자를 의미한다.

 그것이 하나 이상, 3개 이하 매치되는 경우를 의미한다.

Case3) {3,}는 3이상이라는 뜻이다.

 첫 번째는 대문자라서 선택되지 않았다.

 

? + *를 { }를 사용하는 수량자로 똑같이 표현할 수 있다.

Case1 = Case2) * = {0,}

Case3 = Case4) + = {1,}

Case5 = Case6) ? = {0,1}

 

 

Case1) .*은 모든 텍스트를 뜻한다.

Case2) 수량자 뒤에 ?가 오게되면 그 수량자의 의미가 달라지게 된다.

 *는 0~多인데, 뒤에 ?가 오면 그 중 가장 적은 수량자에 해당되는 0의 의미를 갖게 된다.

 그 결과 .은 사용되지 않게 된다. 그래서 r만 남게 된다.

Case3) r 뒤에 어떤 문자가 오는데, 그 문자의 수량은 반드시 1개 이상이어야 한다.

 

 

Case4) +는 1~多 의미. 그 뒤에 ?가 붙어서 1의 의미를 갖게 된다.

 결과적으로 r 뒤에 문자 하나만 오는 것을 선택하게 된다.

Case5) ?는 0~1이다. 즉, r 뒤에 문자가 없을 수도 있고 하나일 수도 있다.

Case6) 0~1 중 가장 작은 0이 된다. 결국 r만 남는다.

 

이렇게 했을 경우 따로따로 선택되지 않고 통째로 선택되어버린다.

= 탐욕적인 수량자 (greedy quantifier)

 

global 체크했을 경우

global 체크 안 했을 경우

게으른 선택자 (lazy quantifier)

 

 

 

캐릭터(문자) 클래스(그룹)

[A-z0-9_] 이런 것보다 더 간편한 방법

Case1) \w는 word(단어)라는 뜻이다.

 즉, alphanumeric plus "_" = 알파벳, 숫자, _를 뜻한다. (공백은 제외)

Case5 = Case1

 

대문자 W는 소문자 w와 정반대의 의미이다.

즉, word가 아닌 것.

 

빈칸

 

d = digit = 0~9 숫자

Case1 = Case3

 

워드 바운더리 → '단어'를 식별 (띄어쓰기)

단어들을 다 찾으려면 \b\w+\b

 

 

 

\b.과 정반대의 결과

 

행의 가장 앞쪽, 뒤쪽 바운더리 지정

Page3의 ^(행의 시작 의미) $(행의 끝을 의미)와 비슷하지만 약간 차이가 있다.

 

※ multiline: 여러 행에 대해서 패턴을 적용한다.
^Ere  &  multiline → Ere라는 행으로 시작하는 문자들이 선택됐다.

\AEre  &  multiline  multiline임에도 불구하고 첫번째 행의 첫번째 문자만을 가리킨다.

 

test$  &  multiline →test로 끝나는 행들이 전부 선택됐다.

 

test$  &  multiline  multiline임에도 불구하고 마지막 행의 마지막 문자만을 가리킨다.

 

Case1) \w는 문자를 의미. +는 1~多.

 (?+ )는 특수한 기호로, 문자를 검색할 때는 X를 쓰지만, 문자를 선택할 때는 X를 제외한다.

Case2) Case1에서 (?=X)를 빼면 이런 결과가 나온다.

Case3) X 대신 \w

 

 

'PHP > 생활코딩' 카테고리의 다른 글

5/27(2) 생활코딩  (0) 2020.05.27
5/27 생활코딩  (0) 2020.05.27
5/25(3) 생활코딩  (0) 2020.05.25
5/25(2) 생활코딩  (0) 2020.05.25
5/25 생활코딩 * 이미지 다루기 수강해야 함*  (0) 2020.05.25

댓글