정규표현식(정규식)
- 문자열을 처리하는 방법 중 하나로 특정한 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 하는 수단 (생활코딩)
- 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식언어이다. 프로그래밍에서 문자열의 검색과 치환을 위해 지원하고 있다. 파이썬, 자바, 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
'Algorithm > 이론과 도구' 카테고리의 다른 글
[Kotlin] String 핸들링을 위한, 코틀린의 String 클래스를 뜯어보자 (0) | 2022.02.24 |
---|