Algorithm/이론과 도구

정규표현식 정리

노소래 2021. 6. 26. 16:37

정규표현식(정규식)

- 문자열을 처리하는 방법 중 하나로 특정한 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 하는 수단 (생활코딩)

- 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식언어이다. 프로그래밍에서 문자열의 검색과 치환을 위해 지원하고 있다. 파이썬, 자바, C, C++에서는 표준 라이브러리를 통해 제공 (위키백과)

 

특징

1. 정규표현식은 대소문자를 구분한다

2. 띄어쓰기도 구분한다.

3.

 

아래 표를 작성함에 있어 작성자가 임의로 정한 것

1. s는 정규식에 쓰이는 임의의 문자열을 나타낸다. (\s도 있다는 것을 나중에 알았다ㅎㅎ)

2. c는 정규식에 쓰이는 임의의 문자를 나타낸다.

3. ...은 직전 앞의 것이 여러개 올 수 있다는 말이다.

4. n, m은 숫자를 나타낸다.

4. str은 source string을 의미

5. 생활코딩을 수강하며 내가 이해한 대로 적었기 때문에 완전히 정확하지는 않을 수 있다. 그런 경우 ?를 붙였다. 

Regex Description Example
^s 시작위치에 있는 문자열 (str에 ^가 있다면 백슬래쉬(\)^ 사용, escape아래도 마찬가지 적용) 캐럿? 이라 부름 ^소래  => 소래로시작하는 문자열
s$ 끝위치에 있는 문자열  달러?라고 부름 소래$ => 소래로 끝나는 문자열
. 모든 문자 (공백 포함), 여러개 찍으면 그 개수만큼 길이 가진 문자열 \..\. => .으로시작하고 그 다음 어떤 문자든 오고 그리고 .으로 끝나는 문자열
[c...] 각 c중 하나 bracket?라고 부름 [oyu] => o나 y나 u가 등장하는 문자하나
[abc][dfg] => 두글자인데 앞글자는 a, b, c중 하나이고 뒷글자는 d, f, g중 하나인 문자열
[c-c...] ([]에 지정해야할 문자가 많을 때 사용) 범위 중 하나, 앞 c가 더 작아야한다? [A-Z] => 모든 대문자 중 문자 하나
[A-Za-z1-9] 이런 것도 가능 => 저 세 범위에 해당하는 문자 하나
[^c...] []안의 맨 앞에 ^을 붙이면 not의 의미 저 안의 c를 제외한 문자 하나를  의미 [^sorae] => s, o, r, a, e를 제외한 문자 하나
[^X-Z] =>X, Y, Z를 제외한 문자 하나 
(s|s...) []안에서 |는 or를 나타낸다. 저 s중에 하나의 문자열 subpattern이라고 부름 (key|clip)board => key나 clip으로 시작하고 board로 끝나는 문자열 (keyboard|clipboard)와도 같은 의미이다.
c* 어떠한 패턴이 얼만큼 등장하는지를 숫자로 표현하는 수량자 중 하나, 뒤에 + ?가 나머지 두 개의 수량자
*앞 c가 0개~여러개 연속하는 문자열
.* => 모든 문자열
[-@]* =>  -또는 @가(번갈아가며 나타나도 무관) 연속되는 문자열
c+ +앞 c가 1개~여러개 연속하는 문자열 \*+ => *이 하나 이상 오는 문자열
[^ ]+ => 공백이 아닌 것이 하나이상 있을 때 선택 즉 공백을 제외한 모든 문자열이 선택된다.
c? ?앞 c가 0개 or 1개 오는 문자열 -s?s?s?- => -- -s- -ss- -sss- 중 하나인 문자열 즉 s가 최대 세개 중 하나 -ssss-는 안되겠다!
r.*? => r 하나인 문자 *의 의미가 ?로 여러개의 의미 없어지고 수량자 0이 된다.
r.+? => r 하나있고 아무 문자 하나 오는 문자열, +의 의미가 ?로 여러개의 의미 없어지고 수량자 1이된다.
r.?? => r하나인 문자 ?의 의미가 ?로 1의 의미 없어지고 수량자 0이된다.
c{n,m} {n,m}앞 c가 n에서 m개까지 오는 문자열
{n,} 라고 쓰면 n번 이상 오는문자열 그래서
{0,}은 *와 같은 의미
{1,}은 +와 같은 의미
{0,1}은 ?와 같은 의미
.{4} => 어떤 문자든 간에 네글자인 문자열
[0-9]{1,9} => 0부터9중 하나가 1~9번오는 문자열
Greedy
Lazy
바로 아래 글 참고

 
\w [A-z0-9_]와 같은 의미 (알파벳, 숫자, _  중 하나인 문자) 아래 포함 이런 것을 character class 라고 한다.    
\W [^A-z0-9_]와 같은 의미  
\d [0-9]와 같은 의미  
\D [^0-9]와 같은 의미  
\bs
s\b
워드 바운더리라는 패턴 \b\n\b => 영문자 숫자 _ 중 하나인 문자 하나
cat concat이라는 문자열이 있을 때 앞의 cat만 선택하고 싶다면 \bcat을 적용하면 된다.  cat\b을 적용하면 앞 뒤 cat 둘 다 선택된다. 그리고 \b.이라고 하면cat concat가 매칭된다.(c 공백 c 따로)
\B 워드 바운더리와 정반대의 결과  
/As ^은 라인별로 시작을 의미하지만 /A는 전체 시작을 의미한다.  
s/Z $은 라인별로 끝을 의미하지만 /Z는 전체 끝을 의미한다.  
(?=c) 문자를 검색할 때는 c를 쓰지만 선택할 때는 제외한다는 의미이다. \w+(?=\w) => 이러면 단어 검색될 때마다 마지막 문자하나 빼고 선택된다.

탐욕적인 수량자 (Greedy Quantifier)

소스스트링 <div>test</div><div>test2</div>에 

정규표현식 <div>.+</div> 적용했는데 

<div>test</div><div>test2</div> 전부가 매칭된 경우 이걸 막는 법은

게으른 선택자 (Lazy Quantifier)

<div>.+?</div> 라고 적용하는 것이다. 그럼

<div>test</div>이거 하나 <div>test2</div> 이거 하나 따로 매칭됨

 

 

정규표현식을 쉽게 작성할 수 있게 도와주는 툴 : gskinner.com/RegExr