정말 막강한 녀석이다!!
피가 되고 살이 되는 녀석이다!! 무조건 열공하자!!
참고 사이트
자바 >> http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
자바스크립트 >> http://w3schools.com/jsref/jsref_obj_regexp.asp
오라클 >> http://docs.oracle.com/cd/E11882_01/server.112/e26088/ap_posix001.htm#i690819
** 정규식 예제 포함
2012/08/17 - [Dev. 640시간 뭉개기/강의내용정리] - [데이터베이스] 16일차 - 함수(숫자, 문자), 정규식
* 정규식 만들기
1. Javascript
방법 2.
var regexp = /pattern/[flags] ;
var test = regexp.test(to be checked)
방법 2.
var regexp = new RegExp("pattern"[, "flags"]);
var test = regexp.test(to be checked)
* flags 종류
g : global match, 일반적으로 패턴이 1번만 발견되면 찾기를 종료하지만, g flag가 있으면, 문자열 내에서 모든 패턴을 찾는다.
i : ignore case, 대소문자를 고려하지 않고 체크한다.[a-z]와 [A-Z]는 같은 표현이 된다.
m : match over multiple lines, 여러 줄에 걸쳐 체크를 한다.
[ 사용 예제 ]
2012/09/13 - [Dev. 웹/JavaScript] - [JavaScript 예제] 자바스크립트 정규식 이용한 유효성 검사
2013/12/06 - [Dev. 웹/JavaScript] - [javascript 예제] 정규식, input : file onchange시 value값 제거 실 사용 예제
2. Java
package java.util.regex
boolean b = Pattern.matches("pattern", "string to be checked");
[ 사용 예제 ]
2013/12/06 - [Dev. 자바/참고소스] - [java 예제] 정규식 실 사용 예제
공식페이지 정규식 설명 - http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
* 정규식 표현법
-- 이하 java 기준 --
*ⓥ는 valid, ⓘ는 invalid
*형광 초록 바탕 부분은 매칭되는 부분.
문자
용도
예제
\
^
문자열의 시작. []안에서는 not의 의미
* ^A는 "A로 시작"이라기 보다는 "시작 직후에 A가 나온다"는 의미로 해석하는 것이 좋다. 즉, 시작과 끝과 같은 빈 공간을 하나의 문자로 간주하는 것이 좋다. /^A/g
/[^A]/g
$
문자열의 마지막
/t$/
*
0번 이상 반복
/ab*d/g
+
1번 이상 반복 ( = {1,} )
/ab+d/g
?
0번 이나 1번
/e?le?/g
/abc\-?d/g
.
new line 을 제외한 모든 글자
/.n/g
(x)
x를 체크하고 체크한 값을 변수로 저장
/(f..) (b..)/
1th :foo
2th :bar
(?:x)
x를 체크하고 체크한 값을 변수로 저장하지 않음
/(?:f..) (b..)/
1th :bar
x|y
x 또는 y
/green|red/
x(?=y)
x후에 y가 나오고, x부분만 매칭되는 부분으로 간주
/blah(?=soft|hard)/
/blah(?=soft).*/
x(?!y)
x가 나오고 그 뒤에 y가 있으면 안 됨
/blah(?!hard)/
{n}
앞에 지정한 것이 n개
/.{3}/
{n,}
앞에 지정한 것이 n개 이상
/.{3,}/
{n,m}
앞에 지정한 것이 n~m개
/.{3,5}/
[xyz]
x나 y나 z. []안에는 얼마든지 쓸 수 있다.
/[abc]{2}/
[x-z]
x에서 z까지
/[a-z]{4,}/g
[^xyz]
x,y,z를 제외한 나머지 모든 것
/[^a-z]{2,}/g
[\b]
백스페이스. \b와 혼동하지 말것.
/[\b]/g
일반적인 String에서는 \b가 백스페이스를 의미한다.
\b
단어의 경계.[\b]와 혼동하지 말것.
/\bn[a-z]/g
\B
\b 를 제외한 전부
/\Bn[a-z]/g
\cX
컨트롤X와 매칭. \cM은 컨트롤M과 매칭
\d
숫자.[0-9]와 같음
/\d/g
/^0[0-9]{2}/g
\D
\d 를 제외한 전부
/\D/g
\f
form-feed
\n
new line
\r
carriage return
\s
white space
ex>탭, 띄어쓰기, \n, \r/k\s/g
\S
\s 를 제외한 전부
/k\S/g
\t
탭
\v
vertical tab
\w
알파벳+숫자+_. [A-Za-z0-9_]와 동일
/\w/g
\W
\w 빼고 전부
/\W/g
\n
\n이 자연수일때, ()로 지정한 n번째 정규식
/(.{2})e tru\1 is out \1ere/
(th)가 \1로 지정된다.
1th :th
\xhh
hh는 hexacode,
/[\x21-\x40]/g
Code table 보기
\uhhhh
hhhh는 hexacode,
/[\u3131-\u3163\uac00-\ud7a3]/g
코드 번호> 3131:ㄱ 3163:ㅣ ac00:가 d7a3:힣 (javascript, java)
-- 이하 javascript 기준 --
함수 | 코드예제 | 코드설명 |
---|---|---|
Array RegExp.exec (to be checked) |
var myRe=/d(b+)(d)/ig;
var myArray = myRe.exec("cdbBdbsbz"); /d(b+)(d)/ig
|
myArray.index =1 ; (처음으로 매칭되는 위치, 컴터가 늘 그렇듯 위치는 0번째부터 센다.) myArray.input = cdbBdbsbz; (체크할 대상) myArray[0] = dbBd;(검사에 통과한 부분) myArray[1] = bB;(1번째 괄호에서 체크된 부분) myArray[2] = d;(2번째 괄호에서 체크된 부분) myRe.lastIndex =5 ; (다음번 체크를 하기위한 위치.) myRe.ignoreCase = true; (/i 플래그 체크) myRe.global = true; (/g 플래그 체크) myRe.multiline = false; (/m 플래그 체크) RegExp.$_ = cdbBdbsbz;(입력한 스트링) RegExp.$1 = bB;(1번째 괄호에서 체크된 부분 ) |
boolean RegExp.test(to be checked) |
var myRe=/d(b+)(d)/ig;
var checked = myRe.test("cdbBdbsbz"); document.write("checked = " + checked +";<br>"); /d(b+)(d)/ig
|
실행결과: checked = true; |
String RegExp.toString() |
var myRe=/d(b+)(d)/ig;
var str = myRe.toString(); document.write(str);
|
실행 결과: /d(b+)(d)/ig |
String String.replace(pattern or string, to be replaced) |
var str = "abcdefe"; document.write(str.replace("e" , "f")); |
실행 결과: abcdffe e가 2번 있지만, 첫번째 인자가 정규식이 아니라 문자열일 경우는 첫번째 것만 바꾼다. |
var str = "aba"; document.write(str.replace(/^a/ , "c")); |
실행 결과: cba | |
var re = /(\w+)\s(\w+)/; var str = "John Smith"; newstr = str.replace(re, "$2, $1"); document.write(newstr) |
실행 결과: Smith, John re에 의해서 찾아진 문자열 들은 re에서 ()로 표현된 순서대로 $1, $2와 같이 변수로 저장된다. | |
var re = /\s(?:http|https):\/\/\S*(?:\s|$)/g; var str = "url is http://iilii.egloos.com/ !!\n"; str += "blah home: http://www.blah.co.kr"; newstr = str.replace(re, function (str,p1,offset,s) { return "<a href='" + str + "'>" + str + "</a>"; } ).replace(/\n/, "<br>"); document.write(newstr); |
url is http://iilii.egloos.com/ !! blah home: http://www.blah.co.kr str: 찾은 문자열 p1: ()에서 검색된 1번째 문자열. 마찬가지로 p2,p3 등도 가능 offset: str을 찾은 위치 s : 원본 문자열. | |
Array String.match(regular expression |
var str = "ABCdEFgHiJKL"; var myResult = str.match(/[a-z]/g ); for(var cnt = 0 ; cnt < myResult.length; cnt++){ document.write(cnt +":" + myResult[cnt] +"<br>"); } document.write("비교<br>"); var str = "ABCdEFgHiJKL"; var myResult = /[a-z]/g.exec(str); for(var cnt = 0 ; cnt < myResult.length; cnt++){ document.write(cnt +":" + myResult[cnt] +"<br>"); } |
실행 결과: 0:d 1:g 2:i 비교 0:d String.match(RegExp) =>g flag가 있으면 다 찾아낸다. RegExp.exec(String) =>g flag가 있어도, 한 개만 찾고 끝낸다. |
Array String.split([separator[, limit]]) |
var str = "ABCdEFgHiJKL"; var myResult = str.split(/[a-z]/g , 3); for(var cnt = 0 ; cnt < myResult.length; cnt++){ document.write(cnt +":" + myResult[cnt] +"<br>"); } |
실행 결과: 0:ABC 1:EF 2:H 주어진 문자열을 separator를 기준으로 limit 만큼 자른다. |
-- 이하는 오라클 기준 --
Metacharacter | 설명 |
^ | 라인의 시작 부분에 표현식을 적용 |
$ | 라인의 끝부분에 표현식을 적용 |
표 2: 반복 연산자(Repetition Operator, Quantifier)
Quantifier | 설명 |
* | 0 회 또는 그 이상 횟수로 매치 |
? | 0 회 또는 1 회 매치 |
+ | 1 회 또는 그 이상 횟수로 매치 |
{m} | 정확히 m 회 매치 |
{m,} | 최소한 m 회 매치 |
{m, n} | 최소 m 회, 최대 n 회 매치 |
Character Class | 설명 |
[:alpha:] | 알파벳 문자 |
[:lower:] | 소문자 알파벳 문자 |
[:upper:] | 대문자 알파벳 문자 |
[:digit:] | 숫자 |
[:alnum:] | 알파벳/숫자 |
[:space:] | 출력되지 않는 공백 문자(예: carriage return, newline, vertical tab, form feed 등 |
[:punct:] | 구두점 기호 |
[:cntrl:] | (출력되지 않는) 컨트롤 문자 |
[:print:] | 출력 가능한 문자 |
Metacharacter | 설명 | |
| | Alternation | 대체 문자를 구분 (그룹핑 연산자 ()와 함께 사용하기도 함) |
( ) | Group | 반복 연산자 또는 백레퍼런스(backreference)를 위해 대체 유닛을 서브표현식으로 그룹화 ("백레퍼런스" 섹션 참고) |
[char] | Character list | I문자 리스트. 문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됨. 그 예외가 캐럿(^) 기호와 하이픈(-) 기호 |
문법 | 설명 |
[, match_parameter]) |
source_string은 문자 데이터타입 지원 (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2, NCLOB 단 LONG 은 제외). pattern매개변수는 정규 표현식을 참조하는 또 다른 이름. 옵션으로 제공되는 match_parameter를 이용하여 newline 문자의 처리, 멀티라인 포맷의 유지, 대소문자 구분 등을 처리할 수 있음. |
문법 | 설명 |
[, start_position [, occurrence [, return_option [, match_parameter]]]]) |
pattern을 검색하여 패턴의 첫 번째 위치를 반환. 필요한 경우 start_position y을 이용하여 검색을 시작할 위치를 지정할 수 있음. occurrence매개변수는 같은 패턴을 여러 번 검색하고자 하는 경우에 사용(디폴트는 1). return_option은 패턴의 시작 위치를 반환(디폴트 값은 0). 1로 설정되는 경우 매치된 패턴의 다음 문자 위치를 반환. |
표 7: 5 자리 숫자 + 4 자리 Zip-Code 표현식에 대한 설명
문법 | 설명 |
매치되어야 하는 빈 공백 | |
[:digit:] | POSIX "numeric digit" 클래스 |
] | 문자 리스트(character list)의 끝 |
{5} | 문자 리스트에 대해 정확히 5 회 반복 |
( | 서브표현식(subexpression)의 시작 부분 |
- | 하이픈(-) 문자 (문자 리스트 내의 range 메타문자로 사용되지 않았음에 주의) |
[ | 문자 리스트의 시작 부분 |
[:digit:] | POSIX [:digit:] 클래스 |
[ | 문자 리스트의 시작 부분 |
] | 문자 리스트의 끝 부분 |
{4} | 문자 리스트를 정확히 4 회 반복 |
) | 서브표현식을 묶는 괄호 기호 |
? | ? 반복 연산자는 그룹핑된 서브표현식을 0 회 또는 1 회 매치하여 옵션으로 4 자리 코드를 사용할 수 있게 함 |
$ | 검색 위치를 라인의 끝부분으로 지정하기 위한 앵커 메타문자 |
문법 | 설명 |
[, position [, occurrence [, match_parameter]]]) |
REGEXP_SUBSTR 함수는 패턴애 매치되는 서브문자열을 반환. |
문법 | 설명 |
[, replace_string [, position [,occurrence, [match_parameter]]]]) |
매치된 패턴을 지정된 replace_string으로 대체하고, 복잡한 검색/대체 작업을 가능하게 하는 함수. |
표 10: 백레퍼런스 메타문자 (Backreference Metacharacter)
Metacharacter | 설명 | |
\digit | Backslash | 백슬래시 뒤에 1-9 사이의 숫자를 명시하여, 괄호 처리된 N 번째 서브표현식을 참조하기 위해 사용. (참고: 백슬래시는 정규 표현식에서 다른 의미로 사용되기도 함. 문맥에 따라 Escape 문자를 의미할 수도 있음. |
표 11: 패턴-스왑(Pattern-Swap) 정규 표현식의 설명
정규 표현식 아이템 | 설명 |
( | 첫 번째 서브표현식의 시작 |
. | (newline을 제외한) 임의의 단일 문자와 매치 |
* | 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치 |
) | 첫 번째 서브표현식의 마지막. 매치 결과는 \1 에 캡처됨(예제에서는 Ellen을 캡처) |
공백 기호 | |
( | 두 번째 서브표현식의 시작 |
. | newline을 제외한 임의의 단일 문자와 매치 |
* | 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치 |
) | 두 번째 서브표현식의 마지막; 매치 결과는 \2 에 캡처됨(예제에서는 Hildi를 저장). |
공백 기호 | |
( | 세 번째 서브표현식의 시작 |
. | newline을 제외한 임의의 단일 문자와 매치 |
* | 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치 |
) | 세 번째 서브표현식의 끝 부분. 매치 결과는 \3 에 캡처(예제에서는 Smith를 저장). |
표 12: Social Security Number 정규 표현식의 설명
정규 표현식 아이템 | 설명 |
^ | 라인 문자의 시작(정규 표현식은 매치되기 이전의 문자를 가져 올 수 없음.) |
( | 서브표현식을 시작하고 | 메타문자를 이용하여 대체 목록을 제공 |
[ | 문자 리스트(character list)의 시작 |
[:digit:] | POSIX "numeric digit" 클래스 |
] | 문자 리스트의 끝 부분 |
{3} | 문자 리스트를 정확하게 3 회 반복 적용 |
- | 하이픈 |
[ | 문자 리스트의 시작 |
[:digit:] | POSIX numeric digit 클래스 |
] | 문자 리스트의 끝 부분 |
{2} | 문자 리스트를 정확하게 2 회 반복 적용 |
- | 또 다른 하이픈 기호 |
[ | 문자 리스트의 시작 |
[:digit:] | POSIX numeric digit 클래스 |
] | 문자 리스트의 끝 부분 |
{4} | 문자 리스트를 정확하게 4 회 반복 적용 |
| | 대체(alternation) 메타문자 - 첫 번째 선택을 종료하고 두 번째 대체 표현식을 시작 |
[ | 문자 리스트의 시작 |
[:digit:] | POSIX numeric digit 클래스. |
] | 문자 리스트의 끝 부분 |
{9} | 문자 리스트를 정확하게 9 회 반복 |
) | 대체를 위해 사용된 서브표현식 그룹을 종료하는 괄호 기호 |
$ | 라인의 끝부분을 의미하는 앵커 메타문자 (매치된 패턴 이후에 어떤 문자도 뒤따라 올 수 없음) |
'Dev. 참고자료' 카테고리의 다른 글
자바 이클립스(eclipse) 단축키 (0) | 2012.08.30 |
---|---|
이클립스(Eclipse) 다운로드 및 환경설정 (0) | 2012.08.28 |
[설치 및 환경 세팅] 데이터베이스 - ORACLE ( XP 기준 ) (0) | 2012.08.13 |
프로그래밍 코딩시의 명명법 (1) | 2012.07.26 |
(ascii) 특수문자의 발음 - 프로그래밍 기초 (0) | 2012.07.25 |