clear_uncertainty

정규표현식(Regular Expression)에 대하여 - 수량자(Quantifier) (11~17) 본문

언어/정규표현식(Regular Expression)

정규표현식(Regular Expression)에 대하여 - 수량자(Quantifier) (11~17)

SOidentitiy 2021. 10. 7. 17:19
728x90

본 포스팅은 생활코딩님의 정규표현식 토픽을 공부하고 정리한 내용입니다.

åç본 포스팅의 패턴(Page) 및 설명은 http://zvon.org/comp/r/tut-Regexp.html#Pages~Contents 를 참고했습니다.

 

 


정규표현식 패턴들

Page 11

Quantifier에 대해 알아봅시다. Quantifier를 우리말로 하면 수량자라는 뜻입니다.

수량자는 어떠한 패턴이 얼마나 등장하는 가, 숫자를 나타냅니다.

수량자는 크게 *, +, ? 로 세가지가 있습니다.

* : 0개~여러개

+ : 1개~여러개

? : 0개~1개

Source : aabc abc bc

Case1

Regular Expression  a*b
First match aabc abc bc
All match aabc abc bc

a*b 는 b 앞의 a가 0개~여러개를 검출합니다. 따라서 a가 2개인 aab , a가 1개인 ab, a가 0개인 b 모두 검출됩니다.

Case2

Regular Expression  a+b
First match aabc abc bc
All match aabc abc bc

a+b 는 b 앞의 a가 1개~여러개를 검출합니다. 따라서 a가 2개인 aab , a가 1개인 ab가 검출됩니다. bc는 a가 없으니 검출되지않습니다.

Case3

Regular Expression  a?b
First match aabc abc bc
All match aabc abc bc

a?b 는 b 앞의 a가 0개~1개를 검출합니다. 따라서 a가 1개인 ab, a가 0개인 b가 검출됩니다. aabc는 a가 두개이므로 앞에 있는 a를 제외하고 ab가 검출됩니다. 

Page 12

12 페이지에선, *와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : -@- *** -- "*" -- *** -@-

Case1

Regular Expression  .*
First match -@- *** -- "*" -- *** -@-
All match -@- *** -- "*" -- *** -@-

*은 * 앞의 문자를 0개~여러개를 함께 검출하고, .은 모든 특성을 포함하기때문에 .*은 모두 검출합니다.

Case2

Regular Expression  -A*-
First match -@- *** -- "*" -- *** -@-
All match -@- *** -- "*" -- *** -@-

-A*-는 -와 - 사이에 A가 0개~여러개가 포함되는 것을 검출합니다. 따라서 --는 -와 -사이에 A가 0개이므로 검출되고

-@-는 -와 -사이에 A가 아닌 @가 포함돼기에 검출되지않습니다.

Case3

Regular Expression  [-@]*
First match -@- *** -- "*" -- *** -@-
All match -@- *** -- "*" -- *** -@-

[-@]*는 대괄호 안의 -와 @가 둘 중 하나가 있는 것을 검출하고, [-@]*은 [-@]가 하나의 문자로 [-@]가 0개~여러개를 검출합니다.

따라서 위와 같이 검출합니다.

 

Page 13

13 페이지에선, +와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : -@@@- * ** - - "*" -- * ** -@@@-

Case1

Regular Expression  \*+
First match -@@@- * ** - - "*" -- * ** -@@@-
All match -@@@- * ** - - "*" -- * ** -@@@-

\*+ 는 \를 통해 문자 *를 검출하고, +를 통해 문자 *를 1개~여러개 검출합니다

Case2

Regular Expression  -@+-
First match -@@@- * ** - - "*" -- * ** -@@@-
All match -@@@- * ** - - "*" -- * ** -@@@-

-@+- 는 -와 -사이에 @가 1개 이상을 검출합니다. 따라서 -@@@-를 검출합니다.

Case3

Regular Expression  [^ ]+
First match -@@@- * ** - - "*" -- * ** -@@@-
All match -@@@- * ** - - "*" -- * ** -@@@-

[^ ]+ 에서 [^ ]는 ^가 공백을 부정하므로 공백이 아닌 텍스트 전부를 검출합니다.

Page 14

14 페이지에선, ?와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

Case1

Regular Expression  -X?XX?X
First match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

-X?XX?X 는 - 뒤에 XX를 포함하고 XX 앞, 뒤로 X가 0개 또는 1개를 검출합니다.

검출할 수 있는 텍스트로는 -XX,-XXX,-XXXX가 있습니다.

따라서 -XX는 XX만 포함하고 앞 뒤로 X가 0개이므로 검출합니다.

Case2

Regular Expression  -@?@?@?-
First match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

-@?@?@?- 는 -와 - 사이에 @가 0개 또는 1개를 검출합니다. 같은 패턴이 3개있으므로,

따라서 검출할 수 있는 텍스트로는 --, -@-, -@@-, -@@@- 가 있습니다.

Case3

Regular Expression  [^@]@?@
First match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

[^@]@?@는 [^@]는 @가 아닌 것이고, @?는 @ 0개 또는 1개를 검출합니다.

-@는 -가 @ 아닌 것이고, @?가 0개를 나타내고, 뒤 @가 붙은 것이기때문에 검출합니다.

Page 15

15 페이지에선, 수량을 정확하게 설정하는 수량자를 알아봅시다.

정확한 수량을 설정하는 수량자는 기호 { }를 사용합니다.

예시를 통해 알아봅시다.

Source : One ring to bring them all and in the darkness bind them

Case1

Regular Expression  .{5}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

.{5}는 5개의 문자를 검출합니다. 따라서 First match에서 One r 을 검출하고One r/ing t/o bri/ng th/em al/l and/ in t/he da/rknes/s bin/d the///m이므로 마지막 m을 제외하고 검출합니다.

Case2

Regular Expression  [els]{1,3}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

 [els]{1,3}은 e,l,s을 검출하돼 길이가 1이상 3이하를 검출합니다.

Case3

Regular Expression  [a-z]{3,}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

[a-z]{3,}는 소문자로 시작하는 것 중 길이가 3이상인 것을 검출합니다.

따라서 One 은 대문자로 시작하기 때문에, to와 in은 길이가 2이기때문에 검출하지않습니다. 

Page 16

16 페이지에선 앞서 배운 *, +, ? 을 중괄호로 표현해봅시다.

+는 0이상이기때문에, {0,}와 같습니다.

*는 1이상이기때문에, {1,}와 같습니다.

?는 0또는 1이기때문에, {0,1}와 같습니다.

Page 17

17 페이지에선 수량자 뒤에 ?가 들어갔을때를 알아봅시다.

예시를 통해 알아봅시다.

Source : One ring to bring them all and in the darkness bind them

Case1 

Regular Expression  r.*
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.*는 앞서봤던 것 처럼 r뒤에 모든 속성과 상관없이( . ) 길이가 0이상인 것을 검출합니다. 따라서 r로 시작해 문장 끝에서 끝납니다.

Case2

Regular Expression  r.*?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 *뒤에 ?가 붙으면 이는 0을 나타냅니다. 따라서 r만을 검출합니다.

Case3

Regular Expression  r.+
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.+ 는 r뒤에 모든 속성인 길이가 1이상을 검출합니다. 따라서 r부터 문장끝까지 검출합니다.

Case4

Regular Expression  r.+?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 +뒤에 ?가 붙으면 이는 1을 나타냅니다. 따라서 r뒤에 문자 하나만을 붙여 검출합니다.

Case5

Regular Expression  r.?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.?는 r은 r뒤에 모든 속성인 길이가 0또는 1일 검출합니다. 따라서 ri, rk를 검출합니다.

Case6

Regular Expression  r.??
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 ?뒤에 ?가 있으면 이는 0을 나타냅니다. 따라서 r만을 검출합니다. 

수량자 뒤에 ?가 붙으면 이는 공통적으로 원래 수량자가 택할 수 있는 수량 중 최소를 택합니다.


이처럼 하는 이유를 알아봅시다.

위처럼 div를 택할때 .+의 기호를 택한다면 <div>와 </div>안의 하나 이상을 택하는 것인데,

<div>text</div>를 택하는 것이 아닌, text의 <div>와 text2의 </div>를 택하여 통으로 검출합니다.

이를 탐욕적인 수량자(Greedy Quantifier)라고 합니다.

이를 앞의 <div>text</div>만을 택하여 검출을 하기위해선,

앞서 했던것처럼 .+?를 한다면 하나씩 체크할 수 있습니다.

이를 게으른 수량자(Lazy Quantifier)라고 합니다.

 


출처

 

 

Regular Expression and its importance in programming | Geekboots

Regular Expression is the most important part of programming - Geekboots

www.geekboots.com

 

정규표현식 패턴들 - 생활코딩

본 수업은 zvon의 정규표현식 tutorials를 이용한다. 실제 강의는 동영상을 참고하자. zvon은 아래의 URL을 통해서 접근 할 수 있다. http://zvon.org/comp/r/tut-Regexp.html#Pages~Contents 아래는 인터렉티브하게 정

opentutorials.org

 

Regular Expressions Tutorial @ZVON.org

 

zvon.org

 

728x90