* 오늘의 진도
정규표현식
정규표현식 패턴들
정규표현식: 문자를 처리하기 위한 일종의 언어
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 |
댓글