정규표현식 만드는 연습을 하는 중임.
예제를 들어 연습중인 것들을 설명한다.
기본 설명은 여기 참고.
regex 의 실제 적용 테스트는 아래 사이트에서 할 수 있다.
시작은 ^ 끝은 $ 6, 4 로 외우자. 만약 ^ 가 없으면, 정규표현식이 문자열의 처음부터 시작하지 않아도 매치되는 곳을 찾음. 예를 들어 qwertyuiop 라는 문자열에서 [aeiou].* 은 qwertyuiop 와 매칭되고 ^[aeiou].* 은 qwertyuiop 와 매칭된다(아무것도 매칭되지 않는다). 왜냐하면 문자열의 처음(q)과 regex 의 처음( [aeiou] ) 이 매칭되지 않으니까 만약 $ 가 없으면, 정규표현식이 문자열의 마지막에 맞추지 않아도 매치되는 곳을 찾음. 예를 들어 qwerty 라는 문자열에서 [w].[t] 는 qwerty 와 매칭되고 [w].[t]$ 는 qwerty 와 매칭된다(아무것도 매칭되지 않는다). 왜냐하면 문자열의 마지막(y) 과 regex 의 마지막( [t] ) 이 매칭되지 않으니까. |
[] 는 하나의 문자열만을 나타낸다. 예를 들어 [a] 면 a 만 매칭되고 b는 매칭되지 않는다. [b] 면 b 만 매칭되고 c, q, e, y, 9 , E, P, -, 2 등은 매칭되지 않는다. [ab] 면 a, b 만 매칭되고 k, l, G, U=, +, ) 등은 매칭되지 않는다. [a-z]면 a, b, c, d, e, ...., z 는 매칭되고, 0, +, Q, A, Z, -, 2, $ 등은 매칭되지 않는다. [a-zA-Z] 면 모든 알파벳이 매칭된다. 그래서 어떤 문자열이 0개 이상 존재해야하는지 검사하고 싶을 때는 [\w]+ 이렇게 사용한다. 만약 특정 문자가 제외되었는지 확인하려면 ^ 을 사용한다. 예를 들어 [^a] 면 a 는 매칭되지 않고 다른 모든 문자열은 매칭된다. [^ieaou] 면 영어 알파벳의 자음은 매칭되고 모음은 매칭되지 않는다. |
특정 문자열이 존재하는지 안하는지 보고 싶을때는 그냥 단순히 적어주면 된다. 예를 들어 url 패턴을 찾는 과정에서 앞에 http 가 반드시 들어가는지 확인하려면 그냥 단순히 ^ http .... $ 해주면 된다. |
http 혹은 https 로 시작하는지 확인하는 등의 작업처럼 s 가 있는지 없는지 체크하려면 ? 를 붙이면 된다. 예를 들어 https? 그러면 ? 앞의 s 가 0개 혹은 1개 가 있는지 확인한다. http, https 모두 매칭된다. 만약 s 가 아니라 ss 가 있는지 확인하고 싶다면? http(ss)? 그러면 http, httpss 가 매칭된다. 만약 http, https, httpss 모두 매칭시키고 싶다면? http(s|ss)? |
한 위치에 이거 혹은 이거 를 나타내고 싶다면 | 를 사용하면 된다. 예를 들어 gray 혹은 grey 를 모두 나타내고 싶다면 gr(a|e)y |
참고로 http url 을 정규표현식으로 확인하려면 다음 regex 를 사용하면 된다. https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*) https://stackoverflow.com/a/3809435 |
지역 번호처럼 02, 033, 061 등이 맨 앞에 오는지 확인하려면 다음과 같이 해준다. ^(02|033|061) 위의 regex는 02 혹은 033 혹은 061 과 매칭된다. |
원하는 문자들이 원하는 조건 하에 원하는 위치에 있길 바란다면 ()를 사용하면 된다. 예를 들어 첫번째 위치에는 http 가 와야 하고 두번째 위치에는 www 가 와야 한다면 ^(http)(www) 위의 regex 에 조건들을 달아서 업그레이드 할 수 있다. 예를 들어 ^(https?)(w{3}) 괄호 하나 당 하나의 독립된 영역이라고 보면 되겠다. |
?, *, +, {} 등은 어떤 문자가 얼마나 와야하는지 나타낸다. ? : 앞의 문자가 0번 또는 1번 존재하는 패턴을 찾는다. ab?c 는 ac, abc 를 찾을 수 있지만, abbc, abbbc, abbbbc, aXc 는 찾을 수 없음. a(bc)?d 는 ad, abcd 를 찾을 수 있지만, abd, abbd,acd, accd, abcbcd, aXXd 는 찾을 수 없음. a[bc]?d 는 ad, abd, bcd 를 찾을 수 있지만, abcd, abbd,abbbd,accd, acccd, abcbcd 는 찾을 수 없음. * : 0번 이상 존재하는 패턴을 찾는다. ab*c 는 ab, abc, abbc, abbbc, abbbbc 를 찾을 수 있지만, aXbc, abXc, aXc 는 찾을 수 없음. a(bc)*d 는 ad, abcd, abcbcd, abcbcbcd, abcbcbcbcd 를 찾을 수 있지만, aXbcd, abcXd, abXcd 는 찾을 수 없음 a[bc]*d 는 ad, abd, abbd, abbbbbbbd, acd, accd, acccccccd 를 찾을 수 있지만, aXbd, aXcd, abXd, acXd 는 찾을 수 없음 + : 1번 이상 존재하는 패턴을 찾는다. ab+c 는 abc, abbc, abbbc, abbbbc 를 찾을 수 있지만, ab, aXbc, abXc, aXc 는 찾을 수 없음. a(bc)+d 는 abcd, abcbcd, abcbcbcd, abcbcbcbcd 를 찾을 수 있지만, ab, aXbcd, abcXd, abXcd 는 찾을 수 없음 a[bc]+d 는 abd, abbd, abbbbbbbd, acd, accd, acccccccd 를 찾을 수 있지만, ab, aXbd, aXcd, abXd, acXd 는 찾을 수 없음 {n} 정확히 n 번만큼 존재하는 패턴을 찾는다. ab{3}c 로 찾을 수 있는 패턴은 abbbc 이다. a(bc){3}d 로 찾을 수 있는 패턴은 abcbcbcd 이다. a[bc]{3}d 로 찾을 수 있는 패턴은 abbbd, acccd 이다. {min,} "min"번 이상만큼 발생하는 패턴을 찾는다. ab{3,}c 로 찾을 수 있는 패턴은 abbbc, abbbbc, abbbbbbbc 이다. a(bc){3,}d 로 찾을 수 있는 패턴은 abcbcbcd, abcbcbcbcd, abcbcbcbcbcbcbcd 이다. a[bc]{3,}d 로 찾을 수 있는 패턴은 abbbd, abbbbd,abbbbbbbbd, acccd, accccd, acccccccccd 이다. {min,max} 적어도 "min"번 이상 "max" 미만 발생하는 패턴을 찾는다. ab{3,5}c 로 찾을 수 있는 패턴은 abbbc, abbbbc, abbbbbc 이다. a(bc){3,5}d 로 찾을 수 있는 패턴은 abcbcbcd, abcbcbcbcd, abcbcbcbcbcd 이다. a[bc]{3,5}d 로 찾을 수 있는 패턴은 abbbd, abbbbd, abbbbbd, acccd, accccd, acccccd 이다. |
. : 문자 하나 [^] : 부정문(exclude) a[^bc]d 는 aXd, aYd, a!d, a0d 등을 찾을 수 있지만, abd, acd 는 찾을 수 없음 [0-9] : 숫자 하나 [^0-9] : 숫자가 아닌 문자 하나 [\d] : 숫자 하나 [\D] : 숫자가 아닌 문자 하나 [a-z] : 영문 알파벳 소문자 하나 [A-Z] : 영문 알파벳 대문자 하나 [a-zA-Z] : 영문 알파벳 하나 [^a-zA-Z] : 영문 알파벳이 아닌 문자 하나 [a-z0-9] : 영문 알파벳 소문자 혹은 숫자 하나 [A-Za-z0-9] : 영문 알파벳 혹은 숫자 하나 [^A-Za-z0-9] : 영문 알파벳 혹은 숫자가 아닌 다른 문자 하나 [ \t\r\n\v\f] : 공백 문자 하나 [^ \t\r\n\v\f] : 공백이 아닌 문자 하나 [\s] : 공백 문자 하나 [\S] : 공백이 아닌 문자 하나 [가-힣] : 한글 하나 [^가-힣] : 한글이 아닌 문자 하나 [\w] : 영문 알파벳 혹은 숫자 혹은 _ 하나 [^\w] : 영문 알파벳, 숫자, _ 가 아닌 문자 하나 |
'눈가락' 카테고리의 다른 글
[Pig Latin] 데이터 타입 확인 및 변경하는 방법 (0) | 2022.03.08 |
---|---|
[JAVA] Date Format 설명과 예제 (0) | 2021.09.30 |
[Git] 서버에 push 한 commit 삭제하기 (5) | 2021.05.14 |
[IT] RDBMS, NoSQL, HDFS 차이 설명한 동영상 (0) | 2021.04.24 |
[Fluentd] Docker 를 이용한 High Aavailability 구성 (0) | 2021.04.15 |