정규표현식 TIL#32

may_soouu·2020년 8월 14일
1

정규표현식

문자열을 처리하는 방법 중의 하나로 특정한 조건의 문자를 '검색' 또는 '치환' 하는 과정을 매우 간편하게 처리 할 수 있도록 하는 수단

위치와 이스케이핑

^(캐럿) : 문자열이 맨 앞에 오는 지 판단
$ : 문자열이 맨 끝에 오는지 판단

ex.
소스 : who is who
who로 시작 되는 소스를 검출하고 싶다!
^who
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
who로 끝나는 소스를 검출하고 싶다!
who$

ex. 소스 1212-$25%

\$ \^ : 백 슬러쉬는 백 슬러쉬 뒤에 나오는 문자를 문자로 바꿔주는 역할을 한다. 즉! 달러가 원래 문자열 마지막에 오는 걸 찾겠다는 역할인데 그냥 달러를 의미하게끔 바꿔준다. '백 슬러쉬는 이스케이프한다' 라고 함
그럼 제일 앞에 달러가 오는 문자열을 찾을 땐 ?! >>> ^\$

ex. $12$\-\$25$

\$ : $ $   $  $
^\$ :$
\$$ :         $
\\ :    \ \ 

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

. (온점) : 어떤 문자건 어떤 공백이건 상관없이 모든 것들을 가리키는 특수한 기호

소스 : regualr expressions are powerful
...... : regula
6덩어리씩 쪼개서 문자를 찾고 만약 제일 뒤에 5개의 문자열이 남았다면, 선택이 안된 상태로 남음
소스 = o.k.
이 소스에서 온점 자체를 찾고자 한다면?
\.
\..\. : .k.


특정 문자와 범위

[] : 원하는 문자의 후보군 지정
[]는 하나의 덩어리로 봄!

소스 : How do you do?
[oyu] : o나 y나 u중에 해당되는 문자를 찾아줌
[dH]. : [dH] 중 문자 하나 그리고 온점이 있으니까 그 뒤에 문자 하나
      : Ho do   do
[owy][yow]
owy 중에 문자 하나가 있고, yow중에 문자 하나가 있어서 두 개가 결합된 단어 찾기
ow    yo
여기서 ow 는 owy에서 o랑 yow 에 w 결합 된 것

만약 지정해야 할 문자가 많다면? [-] 를 사용하면 된다.

  • [c-k] == [cdefghigk]
    알파벳 c부터 k 까지의 어미에 있는 문자를 의미

  • [a-d][2-6] 순서는 바뀌면 안됨 즉 23456 찾음

  • [c-ka-d2-6]

  • ^캐럿의 또 다른 활용

  • [^CDghi45] 이렇게 대괄호 안에 캐럿은 부정의 의미

    ABCDEFG
    [^CDghi45]
    ABEFG : CD제외


서브패턴

() : 소괄호 안에 넣기

소스 : monday tuesday friday
(on | ues | rida)
on ues rida 각각 한덩어리
:       on   ues      ida
        
(mon | tues | fri)day
뒤에 공통 분모인 데이 적기
그럼 monday tuesday friday 찾아짐 (day가 같으니까)

..(nd|esd|id)day
앞에 점 두개 > 즉 어떤 문자건 간에 문자 두개가 앞에 위치해야함
mo+nd+day / tu+esd+day / fr+id+day
즉, monday tuesday friday 찾아짐

수량자

어떠한 패턴이 얼만큼 등장하는가 (💡중요중요!!!!)
수량자는 * + ? 세개가 있음

* : 별표 앞에 등장하는 문자가 0~여러개
  : 즉! 있을수도 있고 없을수도 있음
  : ex. a*b 일 때, b앞에 a가 있을수도, 없을수도 있으며 
    있다면 여러개가 있을수도 있고, 하나만 있어도 되고!
  aabc abc bc
  aab  ab  b > 왜냐면 b앞에 a가 없는 것도 (0인 것도)만족한다고 했으니까
+ : 1~ 여러개 의미 ( 즉 한개도 없는 건 안됨)
  : a + b  > b앞에 a 가 한개 이상은 있어야함
aabc abc bc
aabc ab >  bc는 앞에 A가 한개도 없으니까 안됨
? : 없거나 1개인 경우 (0~1)
a?b
aabc abc bc
 ab  ab  b  이렇게 찾아짐

소스 : -@-***--"*"--*** - @-
.* : *은 0~여러개. 그리고 앞에 점(문자열) 즉 모든 텍스트

-A*- : -는 제일 앞에 그리고, A가 0~ 여러개, 그리고 제일 뒤에 데쉬 
-@-***--"*"--*** -@-
      --   --         이거 두개만 해당
            

[-@]*
대괄호는 패턴의 후보군 지정
위의 예로 보면,
소스에 있는 문자 중에 - 혹은 골뱅이 둘중에 하나 있으면 선택
그리고 뒤에 별표가 있으니까 [-@] 이 문자열이 있을 수도 없을수도 있음


소스 : -@@@-***--"*"--*** - @@@ -
\*+ : 이스케이프는 뒤에 별표를 단순한 문자로 만들어줌 그리고 + (1~여러개) 
      즉, 앞에 있는 *가 하나 이상이어야한다
-@@@-***--"*"--*** - @@@ -
     ***   *   ***
     
-@+- : 앞과 뒤는 반드시 - 와야함. @+ : @가 하나 이상있어야함
-@@@-***--"*"--*** -@@@-
-@@@-              -@@@-   

[^ ]+ : 대괄호 안의 ^는 부정을 의미 그리고 뒤에 공백, 
        즉 공백이 아닌 것이 하나 이상 있을 때(제일 뒤에 +)
-@@@-***--"*"--*** -@@@-
-@@@-***--"*"--*** -@@@-
소스 : --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
-X?XX?X
앞에 데쉬 있어야 하고 x가 있는데 뒤에 물음표. 
즉 물음표 앞 엑스가 없거나 1개. 그다음 x 있어야하고 
그리고 x 없거나 1개이거나
그리고 제일 뒤에 X
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@
 -XX  -XX   -XX    -XX     -xx   
 
 -@?@?@?-
 양 끝에 데쉬 있어야 하고 골뱅이는 있어도 되고 없어도 되고, 있다면 최대 3개!
 --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@
     -@-  -@@-  -@@@-          -@@-

원하는 수량을 지정

{} 중괄호를 씀

.{5}
: 어떠건 문자건 간에 5글자를 찾기

ex. 소스 : one ring to bring them els ls e s
공백 포함 5글자씩 끊어서 다 찾음
나머지 남는 문자는 선택 안됨

[els]{1,3}
e l s 중에 한 글자가 1에 이상 3이하로 등장했을 때 매치
ess ll e s 등등..

[a-z]{3,} > 숫자 뒤에 콤마 : 3이상을 의미
ring to bring them
     to는 선택 안됨 2글자니까
     
     
AB*A : AA ABA ABBA ABBBA

AB+A == AB{1,}A
+는 1보다 많아야함

AB?A == AB{0,1}A
?는 0 아니면 1

r 문자로 예시 풀어보기!!!

r.*  
. : 온점은 모든 문자
* : 앞에 0~여러개 문자가 올 수 있음
즉! r뒤에 어떤 문자가 있을수도 없을수도 있음


### 수량자 뒤에 물음표가 오면 > 물음표 앞 수량자의 최솟값! ###
r.*?
물음표는 별(수량자) 뒤에 오면 물음표의 의미는 달라짐. 
기존 물음표 의미: 0 아니면 1개 
* 수량자 뒤에 물음표 오면: 
일단 별표가 가지는 의미는 0~에서 무한
근데 물음표가 뒤에 오면 *은 0의 의미를 가짐 그래서 r뒤에 있는 쩜은 사용되지 않음

r.+ 
r 뒤에 오는 문자는 반드시 한 개 이상

r.+?
+ 뒤에 물음표 나오면?
+의 의미는 
기존 : 1~여러개.
근데 물음표 붙어서 1의 의미를 가짐 
즉 > r뒤에 문자 하나만을 선택하게끔 !

r.?
r뒤에 있는 어떠한 문자가 없거나 1개

r.?? 
물음표가 원래 0~1의 의미
뒤에 물음표가 오니까 0~1의 최솟값인 0
즉 > r만 의미
\w : w는 단어 의미. 단어는 알파벳과 숫자와 __ (언더라인)을 의미함
\w* : 단어(알파벳,숫자,언더라인) 0부터 여러개까지
[a-z]\w* : a-z까지 문자가 오고, 뒤에 뭔가가 올 수도 있고 안 올 수도 있고
\w{5} : 단어 다섯개
\W (대문자임) : 대문자는 반대의 의미. 즉 단어(숫자,알파벳,언더라인)가 아닌 것
== [^A-z0-9]
\d (digit) 0-9까지 숫자 == [0-9]
\D 숫자가 아닌 것
\b\w : 문자 앞에 시작하는 단어
\w\b : 단어 끝나는 지점
\b\w+\b : 각 단어만 식별
\B. > 앞자리 빼고 두번째자리부터 쭉 선택
\A 는 시작점이라는 경계를 의미
\A... 임의의 문자 3개


정규표현식 사이트 : gskinner.com/RegExr

profile
back-end 개발자

0개의 댓글