"정규 표현식"의 두 판 사이의 차이

 
(사용자 4명의 중간 판 17개는 보이지 않습니다)
7번째 줄: 7번째 줄:


==메타 문자==
==메타 문자==
* 원래의 문자 용도가 아닌 특별한 목적으로 사용 되는 문자
{| class='wikitable'
{| class='wikitable'
! 기호 !! 의미 !! 예시
! 기호 !! 의미 !! 예시
12번째 줄: 13번째 줄:
| { } || 반복개수 || a{2,3} {{해석|a가 2~3개}}
| { } || 반복개수 || a{2,3} {{해석|a가 2~3개}}
|-
|-
| [ ] || 문자범위 || [a-g] {{해석|a~g 중 한글자}}
| [ ] || 문자클래스 || [ab] {{해석|a, b 중 한글자}}, [a-g] {{해석|a~g 중 한글자}}, [^0-9]{{해석|숫자가 아닌 문자}}
|}
|}


18번째 줄: 19번째 줄:
*[ ]사이에 문자가 있으면 이 문자 중 하나는 매치가 된다는 의미임
*[ ]사이에 문자가 있으면 이 문자 중 하나는 매치가 된다는 의미임
:→[ab]의 정규식으로 apple 문자열에 매치 시험을 해보면 a가 찾아지는 것을 알 수 있음
:→[ab]의 정규식으로 apple 문자열에 매치 시험을 해보면 a가 찾아지는 것을 알 수 있음
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /[ab]/;
var pattern = /[ab]/;
var str = "apple";
var str = "apple";
console.log(str.match(pattern)); // ["a"]
console.log(str.match(pattern)); // ["a"]
</source>
</syntaxhighlight>


*[ ]사이의 문자에 하이픈이 있으면 두 문자 사이의 범위를 의미하게됨
*[ ]사이의 문자에 하이픈이 있으면 두 문자 사이의 범위를 의미하게됨
:→[a-c]의 정규식으로 banana 문자열에 매치 시험을 해보면 b가 찾아지는 것을 알 수 있음
:→[a-c]의 정규식으로 banana 문자열에 매치 시험을 해보면 b가 찾아지는 것을 알 수 있음
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /[a-c]/;
var pattern = /[a-c]/;
var str = "banana";
var str = "banana";
console.log(str.match(pattern)); // ["b"]
console.log(str.match(pattern)); // ["b"]
</source>
</syntaxhighlight>


*[ ]사이의 문자에 ^가 있으면 지정한 문자가 없을 경우 매치 됨을 의미함
*[ ]사이의 문자에 ^가 있으면 지정한 문자가 없을 경우 매치 됨을 의미함
:→[^a-c]의 정규식으로 abcd 문자열에 매치 시험을 해보면 d가 찾아지는 것을 알 수 있음
:→[^a-c]의 정규식으로 abcd 문자열에 매치 시험을 해보면 d가 찾아지는 것을 알 수 있음
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /[^a-c]/;
var pattern = /[^a-c]/;
var str = "abcd";
var str = "abcd";
console.log(str.match(pattern)); // ["d"]
console.log(str.match(pattern)); // ["d"]
</source>
</syntaxhighlight>


==메타문자2==
==메타문자2==
59번째 줄: 60번째 줄:
|}
|}
:→ whitespace 문자란 ? space, tab, carriage return, new line, vertical tab, form feed
:→ whitespace 문자란 ? space, tab, carriage return, new line, vertical tab, form feed
*'''.'''는 어떤 문자든 매치가 가능함


==메타문자3==
==메타문자3==
78번째 줄: 81번째 줄:
*| 를 사용하면 or의 의미를 지님
*| 를 사용하면 or의 의미를 지님
:→ john 과 jmnote 둘 중 하나만 맞는 것이 있으면 그것을 매치가 된다고 판단함
:→ john 과 jmnote 둘 중 하나만 맞는 것이 있으면 그것을 매치가 된다고 판단함
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /john|jmnote/;
var pattern = /john|jmnote/;
var str = "My name is john";
var str = "My name is john";
84번째 줄: 87번째 줄:
var str2 = "My name is jmnote";
var str2 = "My name is jmnote";
console.log(str2.match(pattern)); // ["jmnote"]
console.log(str2.match(pattern)); // ["jmnote"]
</source>
</syntaxhighlight>


*^를 사용하면 문자열의 시작이 패턴과 일치하는지 찾음
*^를 사용하면 문자열의 시작이 패턴과 일치하는지 찾음
:→시작이 John으로 시작하는지를 판단
:→시작이 John으로 시작하는지를 판단
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /^John/;
var pattern = /^John/;
var str = "John is running";
var str = "John is running";
console.log(str.match(pattern)); // ["John"]
console.log(str.match(pattern)); // ["John"]
</source>
</syntaxhighlight>
:→문자열이 john으로 시작하지 않기 때문에 아무것도 매치되는 것이 없음
:→문자열이 john으로 시작하지 않기 때문에 아무것도 매치되는 것이 없음
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /^John/;
var pattern = /^John/;
var str = "Jmnote is running with John";
var str = "Jmnote is running with John";
console.log(str.match(pattern)); // null
console.log(str.match(pattern)); // null
</source>
</syntaxhighlight>


*$를 사용하면 문자열의 끝이 패턴과 일치하는지를 찾음
*$를 사용하면 문자열의 끝이 패턴과 일치하는지를 찾음
:→문자열이 john으로 끝나기 때문에 John과 매치됨
:→문자열이 john으로 끝나기 때문에 John과 매치됨
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /john$/;
var pattern = /john$/;
var str = "jmnote is running with john";
var str = "jmnote is running with john";
str.match(pattern); // ["john"]
str.match(pattern); // ["john"]
</source>
</syntaxhighlight>


*\b를 사용하면 경계지점의 문자를 찾음
*\b를 사용하면 경계지점의 문자를 찾음
:→문자 n을 끝나는 경계지점으로 가지는 단어와 매치
:→문자 n을 끝나는 경계지점으로 가지는 단어와 매치
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /n\b/;
var pattern = /n\b/;
var str = "John is running.";
var str = "John is running.";
console.log(str.match(pattern)); // ["n"]
console.log(str.match(pattern)); // ["n"]
</source>
</syntaxhighlight>
:→문자 J를 시작 경계지점으로 가지는 단어와 매치
:→문자 J를 시작 경계지점으로 가지는 단어와 매치
<source lang="javascript">
<syntaxhighlight lang="javascript">
var pattern = /\bJ/;
var pattern = /\bJ/;
var str = "John is my name.";
var str = "John is my name.";
str.match(pattern); // ["J"]
str.match(pattern); // ["J"]
</source>
</syntaxhighlight>


==캡쳐 그룹==
==캡쳐 그룹==
128번째 줄: 131번째 줄:
*$&은 매칭된 값을 찍어줌
*$&은 매칭된 값을 찍어줌


<source lang="javascript">
<syntaxhighlight lang="javascript">
var str = "abcde";
var str = "abcde";
var pattern = /([a])/g;
var pattern = /([a])/g;
console.log(str.replace(pattern, "$1$1"));  //aabcde
console.log(str.replace(pattern, "$1$1"));  //aabcde
</source>
</syntaxhighlight>
:→ 패턴인 문자 'a'를 만나면 캡쳐1을 두번 바꿔줌
:→ 패턴인 문자 'a'를 만나면 캡쳐1을 두번 바꿔줌


<source lang="javascript">
<syntaxhighlight lang="javascript">
var str = "abcde";
var str = "abcde";
var pattern = /[a-c]|([d-f])/g;
var pattern = /[a-c]|([d-f])/g;
console.log(str.replace(pattern, "$&$1")); // abcddee
console.log(str.replace(pattern, "$&$1")); // abcddee
</source>
</syntaxhighlight>
:→ "a-c"에 포함 되거나 "d-f"에 포함 되면 패턴을 만족함. 단, "d-f"의 경우 $1 캡쳐를 통해 캡쳐 값이 한번 그리고 $&를 통해 캡쳐된 값이 한번 더 찍힘
:→ "a-c"에 포함 되거나 "d-f"에 포함 되면 패턴을 만족함. 단, "d-f"의 경우 $1 캡쳐를 통해 캡쳐 값이 한번 그리고 $&를 통해 캡쳐된 값이 한번 더 찍힘


152번째 줄: 155번째 줄:
| + || {1,} || 1개 ~ 무한대. (즉 1개 이상)
| + || {1,} || 1개 ~ 무한대. (즉 1개 이상)
|}
|}
==전통 문법 규칙==
[[사이퍼 질의어]], [[sed]], [[vim]], [[펄]] 등 여러 언어와 구현체에서는 다음과 같거나 비슷한 문법 규칙을 따른다.
    메타문자 ;; 표현할 정규식을 지정하는 메타문자들의 열이다.
    =~ m//          ;; 문자열 매칭 동작을 지정한다. (m은 생략 가능)
    =~ s///        ;; 문자열 치환 동작을 지정한다.


==용도 예시==
==용도 예시==
159번째 줄: 169번째 줄:


==같이 보기==
==같이 보기==
*[[정규식 예시]]
{{z컬럼3|
*[[정규식 문자 클래스]]
* [[글롭]](glob)
*[[펄 호환 정규 표현식 PCRE]]
* [[grep]]
*[[POSIX]]
* [[POSIX]]
*[[grep]]
* [[정규표현식 사용패턴]]
* [[정규표현식 예시]]
* [[정규표현식 HTML 파싱]]
* [[정규표현식 문자 클래스]]
* [[펄 호환 정규 표현식 PCRE]]
}}


==참고 자료==
==참고==
* http://en.wikipedia.org/wiki/Regular_expression
* {{위키백과}}
* {{영어 위키백과|Regular_expression}}
* http://php.net/manual/kr/function.preg-match.php
* http://terms.naver.com/entry.nhn?docId=857878&cid=2954&categoryId=2954
* http://terms.naver.com/entry.nhn?docId=857878&cid=2954&categoryId=2954
* http://regexr.com
* http://regexr.com
* http://regexper.com
* http://regexper.com
* https://regexone.com
* https://regex101.com
* https://regexone.com
* https://rubular.com
* http://www.w3schools.com/js/js_regexp.asp
* http://www.w3schools.com/js/js_regexp.asp
* http://speakingjs.com/es5/ch19.html
* http://speakingjs.com/es5/ch19.html
* http://woowabros.github.io/study/2016/08/16/easy_and_fun_reg_exp.html 쉽고 재밌는 정규식 이야기
[[분류:정규표현식]]
[[분류:정규표현식]]

2023년 4월 24일 (월) 13:41 기준 최신판

1 개요[ | ]

regular expression; regexp; regex
정규 표현식, 정규표현, 정규식
  • 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
  • 원하는 문자열을 검색·추출·치환하기 위해 사용하는 패턴식
  • 문자열 집합을 정확하게 표현하기 위해 쓰이는 언어

2 메타 문자[ | ]

  • 원래의 문자 용도가 아닌 특별한 목적으로 사용 되는 문자
기호 의미 예시
{ } 반복개수 a{2,3} → a가 2~3개
[ ] 문자클래스 [ab] → a, b 중 한글자, [a-g] → a~g 중 한글자, [^0-9]→ 숫자가 아닌 문자

3 문자 범위[ | ]

  • [ ]사이에 문자가 있으면 이 문자 중 하나는 매치가 된다는 의미임
→[ab]의 정규식으로 apple 문자열에 매치 시험을 해보면 a가 찾아지는 것을 알 수 있음
var pattern = /[ab]/;
var str = "apple";
console.log(str.match(pattern)); // ["a"]
  • [ ]사이의 문자에 하이픈이 있으면 두 문자 사이의 범위를 의미하게됨
→[a-c]의 정규식으로 banana 문자열에 매치 시험을 해보면 b가 찾아지는 것을 알 수 있음
var pattern = /[a-c]/;
var str = "banana";
console.log(str.match(pattern)); // ["b"]
  • [ ]사이의 문자에 ^가 있으면 지정한 문자가 없을 경우 매치 됨을 의미함
→[^a-c]의 정규식으로 abcd 문자열에 매치 시험을 해보면 d가 찾아지는 것을 알 수 있음
var pattern = /[^a-c]/;
var str = "abcd";
console.log(str.match(pattern)); // ["d"]

4 메타문자2[ | ]

메타문자 설명 동일표현
. \n, \r이 아닌 모든 문자 [^\n\r]
\d 숫자를 찾음 [0-9]
\D 숫자가 아닌 것을 찾음 [^0-9]
\s whitespace를 찾음 [ \t\n\r\v\f]
\S whitespace가 아닌 것을 찾음 [^ \t\n\r\v\f]
\w 문자와 숫자를 찾음 [a-zA-Z0-9_]
\W 문자와 숫자가 아닌 것을 찾음 [^a-zA-Z0-9_]
→ whitespace 문자란 ? space, tab, carriage return, new line, vertical tab, form feed
  • .는 어떤 문자든 매치가 가능함

5 메타문자3[ | ]

메타문자 의미 설명
| or a|b → a 혹은 b
^ 시작 ^a → a로 시작함
$ a$ → a로 끝남
\b 단어 경계 a\b→ a로 끝나는 단어 경계
\B 단어 경계의 반대 b\B→ B로 끝나는 단어 경계가 아닌 것
\ 이스케이프
  • | 를 사용하면 or의 의미를 지님
→ john 과 jmnote 둘 중 하나만 맞는 것이 있으면 그것을 매치가 된다고 판단함
var pattern = /john|jmnote/;
var str = "My name is john";
console.log(str.match(pattern)); // ["john"]
var str2 = "My name is jmnote";
console.log(str2.match(pattern)); // ["jmnote"]
  • ^를 사용하면 문자열의 시작이 패턴과 일치하는지 찾음
→시작이 John으로 시작하는지를 판단
var pattern = /^John/;
var str = "John is running";
console.log(str.match(pattern)); // ["John"]
→문자열이 john으로 시작하지 않기 때문에 아무것도 매치되는 것이 없음
var pattern = /^John/;
var str = "Jmnote is running with John";
console.log(str.match(pattern)); // null
  • $를 사용하면 문자열의 끝이 패턴과 일치하는지를 찾음
→문자열이 john으로 끝나기 때문에 John과 매치됨
var pattern = /john$/;
var str = "jmnote is running with john";
str.match(pattern); // ["john"]
  • \b를 사용하면 경계지점의 문자를 찾음
→문자 n을 끝나는 경계지점으로 가지는 단어와 매치
var pattern = /n\b/;
var str = "John is running.";
console.log(str.match(pattern)); // ["n"]
→문자 J를 시작 경계지점으로 가지는 단어와 매치
var pattern = /\bJ/;
var str = "John is my name.";
str.match(pattern); // ["J"]

6 캡쳐 그룹[ | ]

  • 정규 표현식에서 그룹 캡쳐가 가능함
  • 캡쳐는 $n 타입으로 표현함 ($1, $2, $3...)
  • $0은 의미가 없음
  • $&은 매칭된 값을 찍어줌
var str = "abcde";
var pattern = /([a])/g;
console.log(str.replace(pattern, "$1$1"));  //aabcde
→ 패턴인 문자 'a'를 만나면 캡쳐1을 두번 바꿔줌
var str = "abcde";
var pattern = /[a-c]|([d-f])/g;
console.log(str.replace(pattern, "$&$1")); // abcddee
→ "a-c"에 포함 되거나 "d-f"에 포함 되면 패턴을 만족함. 단, "d-f"의 경우 $1 캡쳐를 통해 캡쳐 값이 한번 그리고 $&를 통해 캡쳐된 값이 한번 더 찍힘

7 수량자[ | ]

기호 의미 설명
? {0,1} 0개(없거나) ~ 1개
* {0,} 0개(없거나) ~ 무한대
+ {1,} 1개 ~ 무한대. (즉 1개 이상)

8 전통 문법 규칙[ | ]

사이퍼 질의어, sed, vim, 등 여러 언어와 구현체에서는 다음과 같거나 비슷한 문법 규칙을 따른다.

   메타문자 ;; 표현할 정규식을 지정하는 메타문자들의 열이다.
   =~ m//          ;; 문자열 매칭 동작을 지정한다. (m은 생략 가능)
   =~ s///         ;; 문자열 치환 동작을 지정한다.

9 용도 예시[ | ]

  • 프로그래밍 언어 문자열 처리
  • 텍스트편집기 문자열 변환
  • Rewrite 엔진

10 같이 보기[ | ]

11 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}