신문 과 프로그래머 . : : ' IT / JAVA ' 카테고리 의 글 목록 
 ' IT / JAVA ' 에 해당 되 는 글 2 건 
 2017 . 05 . 24 정규 표현식 ( regexp ) 
 2017 . 05 . 19 JAVA 정규 표현식 
 2017 . 05 . 24 17 : 43 IT / JAVA 
 정규 표현식 ( regexp ) 
 정규 표현식 이 란 텍스트 ( text ) 를 기술 하 기 위한 표현 방식 을 말 합니다 . 정규 표현식 은 텍스트 를 탐색 하 거나 문자열 을 조작 하 는데 있 어서 강력 한 문법 을 제공 하 여 줍니다 . 
 정규 표현식 은 주로 유닉스 시스템 과 펄 ( perl ) 과 같 은 언어 에서 많이 사용 되 어 왔으며 , 그 말 은 유닉스 시스템 과 펄 은 문자열 을 아주 쉽 게 처리 할 수 있 다는 것 을 의미 합니다 . 
 이러 한 정규 표현식 이 J 2 SDK 1 . 4 에 이르 러서야 공식 적 으로 기본 Package 로 제공 되 게 되 었 습니다 . 
 J 2 SDK 1 . 4 이전 에 는 정규 표현식 을 이용 하 기 위하 여 는 Apache Jakarta 프로젝트 의 Regexp 와 같 은 package 를 많이 이용 하 였 습니다 . 
 1 . 정규 표현식 의 문법 
 정규 표현식 이 란 문자열 안 에서 의 일정 한 패턴 을 표현 하 기 위한 표현식 을 말 합니다 . 이러 한 표현식 은 펄 , 유닉스 시스템 그리고 자바 에서 공통 적 으로 사용 될 수 있 습니다 . 정규 표현식 을 자바 언어 에서 이용 하 기 전 에 먼저 정규 표현식 을 표현 하 는 방법 부터 자세히 알 필요 가 있 습니다 . 
 문자열 안 에서 hello 라는 말 이 들어가 있 는지 , 혹은 숫자 가 안 에 들어가 있 는지 알아보 고자 할 경우 에 사용 됩니다 . 
 정규 표현식 을 잘 사용 한다는 말 은 , 찾 고자 하 는 패턴 에 대한 표현 을 여러 가지 특수 문자 들 을 이용 하 여 잘 표기 한다는 것 을 의미 합니다 . 이러 한 패턴 을 표기 하 기 위한 특수 문자 에 대하 여 잘 알아보 도록 하 겠 습니다 . 
 1 - 1 ) ‘.’ 특수 문자 . 
 ‘.’ 특수 문자 는 임의 의 한 문자 를 나타냅니다 . 예 를 들 면 , h . s 라는 패턴 은 반드시 ‘ h ' 로 시작 하 며 ' s ' 로 반드시 끝 나 는 단어 를 의미 합니다 . 따라서 ' his ', ' hos ' 등 은 모두 해당 패턴 에 일치 하 는 문자열 이 라고 말 할 수 있 습니다 . 그러나 ’ hs ’ 와 같 은 문자열 은 패턴 에 일치 하 지 않 습니다 . 
 그 이유 는 ’.‘ 특수 문자 가 위치 한 곳 에 는 반드시 한 글자 가 위치 하 여야 하 기 때문 입니다 . 
 패턴 일치 하 는 문자열 
 a . b acb , adb , azd 등 
 ab . abc , abd , abz 등 
 . bc abc , dbc , zbc 등 
 1 - 2 ) ‘*’ 특수 문자 . 
 ‘*’ 특수 문자 는 바로 앞 의 문자 를 나타냅니다 . ‘*’ 는 바 로 앞 의 문자 가 없 거나 하나 이상 반복 한다는 의미 를 뜻 합니다 . 만약 ‘ a *' 라고 쓰여 있 는 패턴 이 있 다면 , ' a ', ' aa ', ' aaa ' 등 이 가능 합니다 . ’*‘ 특수 문자 를 사용 할 때 주의 하 여야 할 점 은 패턴 을 지정 할 때 ’*‘ 앞 에 는 한 글자 이상 의 단어 가 반드시 와야 한다는 것 입니다 . 
 hello * hell , hello , helloo , hellooo 등 
 ab * c abc , abbc , abbbc , abbbbc 등 
 * d 불 가능 
 1 - 3 ) '+' 특수 문자 
 ‘+’ 특수 문자 는 ‘*’ 특수 문자 와 흡사 하 지만 , ‘*’ 특수 문자 와 는 달리 반드시 하나 이상 의 문자 가 반복 을 해야 한다는 것 입니다 . 
 예 를 들 자면 ‘ hello +' 라고 패턴 을 지정 한다면 ’ hello ',' helloo ' , ' hellooo ' 등 ‘+’ 특수 문자 바로 앞 의 문자 는 반드시 하나 이상 반복 해야 합니다 . 
 hello + hello , helloo , hellooo , helloooo 등 
 ab + c abc , abbc , abbbc , abbbbc 등 
 + d 불 가능 
 1 - 4 ) ‘?’ 특수 문자 
 ‘?’ 특수 문자 의 바로 앞 의 문자 가 하나 가 있 거나 , 없 거나 하 는 것 을 의미 합니다 . 
 예 를 들 자면 ‘ a ? c ' 라고 패턴 을 지정 한다면 ' c ' , ' ac ' 중 에서 하나 를 의미 하 게 됩니다 . 
 hello ? hell , hello 
 try ? tr , try 
 1 - 5 ) '^' 특수 문자 
 ‘^’ 특수 문자 는 문장 의 처음 을 나타냅니다 . 예 를 들 어 ‘^ Hello ' 라고 작성 된 패턴 이 있 다면 해당 패턴 에 일치 하 기 위하 여 문자열 은 반드시 ' Hello ' 로 시작 을 하 여야 합니다 . 
 ^ Hello Hello World 
 ^ The The pen 
 1 - 6 ) '$' 특수 문자 
 ‘$’ 특수 문자 는 문장 의 끝 을 나타냅니다 . 예 를 들 어 ‘ World $' 라고 작성 된 패턴 이 있 다면 해당 패턴 에 일치 하 기 위하 여 문자열 은 반드시 ’ World ' 로 끝 을 맺 어야 합니다 . 
 World $ Hello PHP World 
 PHP $ Start PHP 
 1 - 7 ) '[ ]' 특수 문자 
 대괄호 ‘[ ]’ 특수 문자 의 의미 는 괄호 안 의 문자 중 일치 하 는 것 을 찾 고자 할 경우 사용 합니다 . 
 예 를 들 자면 '[ abc ] ' 라고 패턴 을 작성 하 게 되 면 문자열 에 ‘ a ' 나 ’ b ' 혹은 ‘ c ' 등 이 있 어야 합니다 . 
 [ abc ] a , b , c , ab , abc 등 
 [ a - z ] 소문자 가 포함 된 모든 문자열 
 [ A - Z ] 대문자 가 포함 된 모든 문자열 
 [ 0 - 9 ] 숫자 가 포함 된 모든 문자열 
 ^[ a - zA - Z 0 - 9 ] 숫자 나 영문자 로 시작 되 는 모든 문자열 
 1 - 8 ) ‘[ ]’ 특수 문자 안 에서 의 ‘^’ 특수 문자 
 대괄호 ‘[ ]’ 특수 문자 안 에서 ‘^’ 특수 문자 가 쓰이 게 되 면 ‘[ ]’ 특수 문자 안 에 있 는 문 
 자 와 일치 하 지 않 는 문자열 을 포함 하 고 있 는 패턴 을 의미 합니다 . 즉 ‘[^ abc ] de ’ 라고 패턴 
 을 작성 하 게 되 면 ' ade ', ' bde ', ' cde ' 를 제외 한 ‘. de ' 패턴 과 같 은 의미 가 됩니다 . 
 [ ^ abc ] de dde , fde , zde 등 
 a [ ^ 0 - 9 ] c abc , acd , add 등 
 있 어야 됩니다 . 
 ( u 가 3 개 이상 ) 
 guuuggle , guuuuggle , guuuuuggle 등 
 1 - 10 ) '( )' 특수 문자 
 소괄호 ‘( )’ 특수 문자 는 ‘( )’ 특수 문자 안 의 글자 들 을 하나 의 문자 로 봅니다 . 예 를 들 어 
 야 됩니다 . 
 ( hello ) * NULL , hello , hellohello , hellohello 등 
 1 - 11 ) ‘|’ 특수 문자 
 패턴 안 에서 OR 연산 을 사용 할 때 사용 합니다 . 예 를 들 어 ' hi | hello ' 는 hi 나 hello 가 포 
 함 되 어 있 는 문자열 을 의미 합니다 . 
 man | woman man , woman , manwoman , superman 등 
 left | right left , right , leftright 등 
 1 - 12 ) 문자 클래스 ( character class ) 
 '[]' 특수 문자 안 에서 자주 사용 되 는 패턴 들 을 미리 키워드 로 정의 하 여 놓 은 것 을 문자 
 클래스 라고 합니다 . 해당 문자 클래스 를 J 2 SDK 1 . 4 에서 는 다르 게 사용 을 합니다 . ( 문자 클 
 래스 는 PHP 와 같 은 언어 에서 는 이용 되 지만 JAVA 에서 는 이용 되 지 않 습니다 . J 2 SDK 1 . 4 의 
 예 를 참고 하 십시요 . ) 
 패턴 문자 클래스 J 2 SDK 1 . 4 의 예 
 ( 모든 영문자 ) 
 ( 숫자 ) 
 ( 영문자 와 숫자 ) 
 1 - 13 ) 정규 표현식 에서 특수 문자 의 사용 
 1 - 12 ) 까지 말 한 특수 문자 를 정규 표현식 의 패턴 에서 사용 하 려면 해당 특수 문자 앞 에 역 슬래시 ( ‘\’) 를 붙입니다 . 물론 역 슬래시 ( ‘\’) 를 패턴 에서 사용 하 려면 역 슬래시 를 2 개 연속 하 여 써 주 어야 합니다 . 
 2 . J 2 SDK 1 . 4 . x 에서 의 정규 표현식 이용 
 J 2 SDK 1 . 4 . x 에서 정규 표현식 을 이용 하 기 위한 방법 으로 는 크 게 , java . lang . String class 에 새롭 게 추가 된 메소드 를 이용 하 는 방법 과 java . util . regex 패키지 를 이용 하 는 방법 이 있 습니다 . 2 가지 방법 에 대하 여 모두 알아보 도록 하 겠 습니다 . 
 2 - 1 ) String class 에 새롭 게 추가 된 정규 표현식 관련 메소드 
 메소드 이름 설명 
 문자열 안 에 regex 정규 표현식 과 일치 하 는 패턴 이 있 다면 true , 그렇 지 않 으면 false 를 반환 합니다 . 
 String replaceAll ( String regex , String replacement ) 
 문자열 안 에 regex 정규 표현식 으로 일치 하 는 모든 부분 을 replacement 문자열 로 치환 한 결과 를 반환 합니다 . 
 String replaceFirst ( String regex , String replacement ) 
 문자열 안 에 regex 정규 표현식 으로 일치 하 는 첫 부분 을 replacement 문자열 로 치환 한 결과 를 반환 합니다 . 
 문자열 안 에 regex 정규 표현식 과 일치 하 는 부분 을 기준 으로 분할 하 여 배열 로 반환 합니다 . 
 예 제 1 ) matches 메소드 의 사용 
 ReTest 1 . java 
 ReTest 1 . java 에서 사용 된 matches 메소드 는 J 2 SDK 1 . 4 . x 이상 에서 만 사용 할 수 있 기 때문 에 컴파일 시 에 는 반드시 “ - source 1 . 4 ” 옵션 을 줘야 합니다 . 
 소스 를 한 줄 한 줄 설명 하 도록 하 겠 습니다 . 
 msg 1 String 형 변수 에 “ hello world ” 문자열 을 지정 한 후 , String class 가 가지 고 있 는 matches 메소드 의 인자 로 regex 1 과 regex 2 를 넣 어서 결과 를 확인 해 보 면 , 첫 번 째 것 은 false 가 두 번 째 것 은 true 가 나옵니다 . 
 regex 1 의 패턴 은 hello 라는 정확 한 패턴 을 찾 는 것 이 기 때문 에 false 이 며 regex 2 의 패턴 은 hello 로 시작 되 며 , 그 후 의 문자열 은 소문자 와 공백 들 로 이루어져 있 다 라는 의미 이 기 때문 입니다 . 
 msg 2 String 형 변수 에 “ hello world 3 ” 이 라는 문자열 을 지정 한 후 , matches 메소드 에 인자 로 regex 3 와 regex 4 에 지정 된 패턴 을 인자 로 넣 어서 일치 되 는지 확인 하 고 있 습니다 . 
 이경우 , “ hello ” 로 정의 된 패턴 은 “ hello ” 와 정확히 일치 하 여야 하 기 때문 에 false 가 나오 며 , “ hello ( [ a - z ] *)” 로 정의 된 패턴 은 msg 2 안 에 들 어 있 는 문자열 3 을 지정 하 지 않 았 기 때문 에 false 가 반 홥 됩니다 . 
 msg 3 String 형 변수 에 " gooooooogle " 이 라는 문자열 을 지정 한 후 패턴 이 일치 하 는지 
 보 고 있 습니다 . regex 5 에 지정 된 패턴 “ goo * gle ” 은 goo 로 시작 하 고 gle 로 끝 나 는 모든 문 
 자 열 을 지칭 하 는 것 이 기 때문 에 true 가 반환 되 며 , regex 6 에 지정 된 패턴 “ google ” 은 정확 
 하 게 “ google ” 과 일치 해야 함 으로 false 가 반환 되 게 됩니다 . 
 예 제 2 ) replaceAll 메소드 의 사용 
 ReTest 2 . java 
 ReTest 2 . java 의 내용 을 한 줄 한 줄 설명 하 도록 하 겠 습니다 . 
 String 형 변수 msg 에 문자열 " gooooooogle goooogle gooogle goooogle " 을 지정 한 후 , 
 replaceAll 메 서 드 를 이용 하 여 regex 패턴 과 일치 하 는 내용 을 “ google ” 이 라는 문자열 로 치환 한 후 결과 를 출력 하 도록 합니다 . 이때 regex 패턴 “ goo * gle ” 은 “ goo ” 로 시작 하 고 “ gle ” 로 끝 나 는 부분 을 의미 함 으로 “ gooooooogle ” 문자 열도 “ google ” 로 , “ goooogle ” 문자 열도 “ google ” 로 “ google ” 문자 열도 “ google ” 로 치환 하 게 됩니다 . 
 예 제 3 ) replaceFirst 메소드 의 사용 
 ReTest 3 . java 
 replaceFirst 메소드 는 replaceAll 메소드 의 사용 방법 과 흡사 하 지만 , 패턴 과 일치 하 는 첫 번 째 문자열 만 치환 을 한다는 것 입니다 . 즉 소스 를 분석 하 면 다음 과 같 습니다 . 
 String 형 변수 msg 에 문자열 " gooooooogle goooogle gooogle goooogle " 을 지정 한 후 , replaceFist 메 서 드 를 이용 하 여 regex 패턴 과 일치 하 는 첫 번 째 문자열 을 “ google ” 이 라는 문자열 로 치환 한 후 결과 를 출력 하 도록 합니다 . 
 이때 regex 패턴 “ goo * gle ” 은 “ goo ” 로 시작 하 고 “ gle ” 로 끝 나 는 부분 을 의미 함 으로 “ gooooooogle ” 문자열 이 “ google ” 로 치환 하 게 됩니다 
 예 제 4 ) split 메소드 의 사용 
 ReTest 4 . java 
 ReTest 4 . java 를 한 줄 한 줄 설명 하 도록 하 겠 습니다 . 
 msg String 변수 에 " one -- two ** three " 문자열 을 지정 한 후 , regex String 변수 에 “ --|\\*\\*” 정규 표현식 을 지정 하 고 있 습니다 . 해당 정규 표현식 의 의미 는 “ --“ 와 일치 하 거나 “ **” 와 일치 하 는 문자열 을 말 합니다 . 이때 “ *” 문자 앞 에 “ \\” 이 사용 된 의미 는 “ *” 
 문자 가 정규 표현식 에서 이미 정의 된 특수 문자 이 기 때문 입니다 . 정규 표현식 에서 “ *” 문자 를 특수 문자 가 아닌 일반 문자 로 사용 하 기 위하 여 는 앞 에 “ \( 역 슬래시 ) ” 가 붙 어야 하 는데 자바 문법 에서 는 큰따옴표 안 에서 “ \_____” 문자 의 표현 은 “ \\” 로 해야 하 기 때문 에 “ \\*” 와 같이 사용 되 었 습니다 . 
 split 메소드 에 regex 변수 를 지정 하 여 문자열 을 나눠 배열 로 나뉘 게 됩니다 . 이 경우 , msg 문자열 에 는 “ --“ 문자열 과 “ **” 문자열 을 기준 으로 쪼개지 면서 ss 배열 에 는 3 개 의 원소 가 지정 되 게 됩니다 . 3 개 의 원소 는 “ one ” , “ two ” 그리고 “ three ” 값 을 말 합니다 . 
 for 반 복문 을 이용 하 여 ss 배열 의 길이 만큼 출력 한 결과 는 따라서 그림 4 ) 와 같이 나오 게 되 는 것 입니다 . 
 1 - 2 ) java . util . regex 패키지 를 이용 한 정규 표현식 의 처리 
 java . util . regex 패키지 는 J 2 SDK 1 . 4 이후 에 추가 된 패키지 입니다 . java . util . regex 패키지 는 Matcher , Pattern 2 가지 클래스 와 PatternSyntaxException 예외 로 구성 되 어 져 있 습니다 . 즉 , java . util . regex 패키지 를 이용 한다는 것 은 위 의 3 가지 클 래스 를 이용 하 는 것 을 의미 합니다 . 
 사용 예 를 하나 들 어 보 도록 하 겠 습니다 . 
 예제 ) java . util . regex 패키지 의 이용 
 ReTest 5 . java 
 System . out . println ( " Found '" + m . group ( 0 ) + "' at position " + 
 ReTest 5 . java 소스 를 보 면 , 
 Pattern class 의 static 메소드 인 compile 메소드 에 regex 문자열 ( 패턴 ) 을 인자 로 넣 어 Pattern 객체 를 할당 받 는 것 을 알 수 있 습니다 . 그 후 에 , Pattern class 가 가지 고 있 는 static 메소드 인 macher 메소드 의 인자 로 str 문자열 을 집어넣 어 Matcher 객체 를 할당 받 습니다 . Matcher 객체 는 complie 메소드 의 인자 로 넣 은 패턴 과 macher 메소드 의 인자 로 넣 은 문자열 과 일치 하 는 정보 를 객체 화 하 고 있 는 객체 입니다 . 
 Macher 객체 를 얻 은 후 에 는 Macher class 가 가지 고 있 는 메소드 를 이용 하 여 , str 문자열 에서 regex 패턴 과 일치 하 는 문자열 의 위치 정보 를 모두 출력 하 게 됩니다 . 
 이때 일치 하 는 문자열 이 없 을 때 까지 모두 뽑아내 기 위하 여 는 find 메소드 를 이용 하 였으며 , 정규 패턴 그룹 0 번 째 에 일치 하 는 문자열 을 발견 하 기 위하 여 는 group 메소드 를 , 일치 하 는 위치 값 을 출력 하 기 위하 여 는 start 메소드 가 이용 되 었 습니다 . 
 정규 표현식 에서 중요 한 것 으로 정규 패턴 그룹 이 여기 에서 사용 되 었 는데 , 정규 패턴 그룹 을 간단 하 게 설명 하 면 아래 와 같 습니다 . 
 - 정규 표현 그룹 이 란 왼쪽 에서 우측 으로 괄호 를 세 는 것 으로써 , 번호 를 붙일 수 있 게 됩니다 . 예 를 들 어 정규 표현식 ( ( A ) ( B ( C ) ) ) 가 있 을 경우 4 개 의 그룹 으로 분류 됩니다 . 0 번 값 은 패턴 전체 를 나타나 게 됩니다 . 
 예제 ) 문자열 에서 URL 값 만 뽑아내 기 
 ReTest 7 . java 
 예제 ) URL 을 자동 으로 링크 걸기 
 ReTest 8 . java 
 ReTest 8 . java 는 ReTest 7 . java 를 약간 수정 하 였 습니다 . 
 ReTest 8 . java 는 Matcher lass 가 가지 고 있 는 replaceAll 메소드 를 이용 하 여 자동 으로 링크 를 걸 어 주 고 있 습니다 . 
 위 의 문장 에서 $ 2 라고 나온 부분 은 정규 패턴 그룹 의 2 번 째 부분 을 말 합니다 . 
 ReTest 7 . java 에서 group ( 2 ) 로 출력 되 는 결과 를 말 합니다 . 
 위 의 표현 은 길이 를 표시 하 는 방법 이 없 다 . 
 아이디 는 대개 첫 글자 는 영문 이 고 두 번 째 부터 는 영문 이나 숫자 가 온다 . 이것 을 표현 하 기 위해선 이것 들 중 에 하나 란 의미 를 갖 는 새로운 표현 이 필요 하 다 . 
 지금 까지 의 규칙 에서 설명 한 용어 를 실제 정규 표현 에서 사용 하 는 표현 으로 바꾸 고 , 다른 세부 적 인 옵션 에 대해 알아보 자 . 
 \ : 다음 의 글자 가 특별 한 문자 임 을 나타낸다 . 때론 , 그 다음 문자 자체 를 의미 하 기 도 한다 . 
 보 기 를 들 면 , "\ n " 은 문자 "\" 과 문자 " n " 두 글자 와 매치 되 는 것 을 의미 하 는 것 이 아닌 , 새줄 ( New Line ) 을 의미 하 며 , "\\" 은 첫 "\" 다음 문자 인 "\" 자체 를 의미 한다 . 즉 , "\\" 은 "\" 과 매칭 된다 . 
 ^ : 입력 문자열 의 맨 처음 을 의미 한다 . ( 맨 첫 글자 가 아니 라 , 맨 처음 이 란 문맥 적 의미 를 말 한다 . 아주 중요 하 다 ) 기본 적 으로 정규 표현 은 입력 문자열 의 한 줄 에 만 적용 된다 . 하지만 , 옵션 에 따라 여러 줄 에 적용 할 수 도 있 다 . 그럴 경우 에 는 "^" 는 "\ n " 나 "\ r " 다음 의 위치 를 의미 한다 . 
 $ : "^" 는 반대 로 입력 문자열 의 맨 끝 을 의미 한다 . 역시 여러 줄 에 정규 표현 이 적용 될 경우 에 는 "\ n " 이나 "\ r " 의 앞 의 위치 를 의미 한다 . 
 . : "\ n " 을 제외 한 한 글자 를 뜻 한다 . 만일 모든 글자 를 표현 하 고 싶 다면 ( "\ n " 마저 도 합친 ) / [.\ n ] / 을 사용 하 면 된다 . 
 x | y : x 또는 y 와 매칭 된다 . 보 기 를 들 면 , / z | food / 는 " z " 또는 " food " 와 매칭 된다 . / ( z | f ) ood / 는 " zood " 또는 " food " 와 매칭 된다 . 
 VBScript 에서 는 SubMatches 컬렉션 에 저장 된다 . 
 ( ? : 패턴 ) : 해당 패턴 과 매칭 은 시키 지만 , 그 부분 을 특정 변수 에 담 지 않 는다 . 왜 이게 필요 할까 ? 
 위 의 보기 에서 / ( z | f ) ood / 는 " zood " 또는 " food " 와 매칭 된다고 했 는데 , 단순히 매칭 의 목적 으로 사용 했 지만 , " zood " 의 경우 " z " 가 $ 0 이란 변수 에 저장 이 되 고 말 았 다 . 이러 한 것 을 막 기 위해서 사용 하 는 것 이 ( ? : 패턴 ) 이 다 . 
 [ ^ xyz ] : "[" 안 에 있 는 표현 을 제외 한 것 중 하나 를 의미 한다 . "[^ abc ] " 는 " plain " 의 " p " 때문 에 매칭 된다 . 
 \ b : 단어 의 경계 ( 단어 와 공백 , "\ n ", "\ r " 의 사이 ) 와 매칭 된다 . 보 기 를 들 면 , " er \ b " 는 " never " 와 는 매칭 되 지만 , " verb " 와 는 매칭 되 지 않 는다 . 
 \ B : 단어 의 경계 가 아닌 것 과 매칭 된다 . " er \ B " 는 " verb " 와 는 매칭 되 지만 , " never " 와 는 매칭 되 지 않 는다 . 
 \ cx : Ctrl + x 키 와 매칭 된다 . "\ cc " 는 Ctrl + C 와 매칭 된다 . x 의 범위 는 [ a - zA - Z ] 이 며 , 만일 이 이외 의 문자 를 사용 한다면 "\ c " 는 " c " 와 동일 하 다 . 
 \ s : 화이트 스페이스 를 의미 한다 . 화이트 스페이스 란 공백 , 탭 , 폼 피드 , 캐리지 리턴 등 을 의미 한다 . [ \ f \ n \ r \ t \ v ] 과 동일 ( "\ f " 앞 에 공백 이 있 다 . 주의 ! ) 
 \ w : "_" 를 포함 한 일반 적 인 단어 에 사용 되 는 문자 를 말 한다 . "[ A - Za - z 0 - 9 _]" 과 동일 
 \ xn : n 은 2 자리 16 진수 이 며 , 해당 16 진수 코드 와 매칭 된다 . "\ x 412 " 는 16 진수 41 은 " A " 이 기 때문 에 " A 2 " 와 매칭 된다 . 
 \ n : "\ 1 " 은 위 에서 캡쳐 한 매칭 ( backreference ) 를 가리킨다고 했 는데 , 만일 이 패턴 앞 에 어떠 한 n 개 의 캡쳐 한 표현 이 있 다면 백 레퍼런스 이 지만 , 그렇 지 않 은 경우 에 는 8 진수 로 간주 하 여 해당 코드 의 문자 와 매칭 된다 . 
 패턴 " o *" 는 " foooood " 와 매칭 된다 . 당연 하 다 ! 하지만 , " f " 앞 의 " o " 와 매칭 되 는 것 이 아니 다 ! ! " ooooo " 와 매칭 된 것 이 다 . 즉 , 기본 으로 정규 표현 매칭 은 가장 큰 범위 를 선택 한다 . 이것 을 greedy 하 다고 한다 . 
 ( 이 의 적절 한 보 기 는 잠시 후 에 나온다 . ) " o *?" 가 방금 말 한 non - greedy 매칭 이 다 . 
 잠시 , 위 에서 " o *?" 가 " o " 와 매칭 된다고 했 는데 이상 하 게 생각 한 분 이 있 었 을 것 이 다 . 맞 다 . " o *?" 는 "" 와 매칭 되 었 다 . "*" 는 0 개 이상 임 을 잊 어선 안 된다 . " o +?" 가 " o " 와 매칭 된다 . 
 그런데 , 위 의 정규 표현 을 HTML 문서 에 적용 하 여 해당 패턴 을 "", 빈 문자열 로 바꾸 면 문서 는 빈 문서 가 되 고 만 다 . 
 greedy 한 매칭 이 기본 값 이 라고 위 에서 언급 을 했 다 . 따라서 , 위 의 HTML 문서 를 보 면 , < html >....</ body > 로 생각 할 수 있 다 . 
 따라서 , 문서 전체 가 사라지 는 것 이 다 . 이것 을 막 기 위해선 "*" 뒤 에 "?" 를 추가 하 면 된다 . 
 좀 더 정제 를 한다면 , 올바른 HTML 문서 는 < 태그 명 > 과 </ 태그 명 > 이 서로 일치 한다 . 이것 도 적용 한다면 , 
 위 의 $ 1 에 해당 되 는 부분 을 좀 더 생각 해 보 면 , ">" 를 제외 한 문자 로 볼 수 있 다 . 따라서 최종 적 으로 아래 와 같이 정리 된다 . 
 /(?:^|")( http | ftp | mailto ) : (?://)?(\ w +(?:[\.:@]\ w + ) * ? ) ( ? : / | @ ) ( [ ^ " \ ? ] * ? ) ( ?:\?([^\?"]*?))?(?:$|")/ 
 JScript VBScript 검색 / ^\[ \ t ] *$/ "^\[ \ t ] *$" 빈 줄 을 찾 습니다 . 
 ( pattern ) pattern 을 찾 아 검색 한 문자열 을 캡 처 합니다 . 캡 처한 문자열 은 VBScript 의 경우 SubMatches 컬렉션 , Jscript 의 경우 $ 0 . .. $ 9 속성 을 이용 하 여 결과 로 나오 는 Matches 컬렉션 에서 추출 할 수 있 습니다 . 괄호 문자 인 ( ) 를 찾 으려면 "\(" 또는 "\)" 를 사용 하 십시오 . 
 \ u n n 은 4 자리 의 16 진수 로 표현 된 유니코드 문자 입니다 . 예 를 들 어 , \ u 00 A 9 는 저작 권 기호 ( ⓒ) 를 찾 습니다 . 
 정규 표현식 을 이용 한 SQL 구문 의 개선 
 저자 - Alice Rischert 
 Oracle Database 10 g 의 정규 표현식 기능 을 텍스트 데이터 처리 를 위한 강력 한 도구 로 활용 할 수 있 습니다 . 
 Oracle Database 10 g 에 추가 된 새로운 기능 을 이용 하 여 문자 데이터 의 검색 , 처리 능력 을 극 적 으로 개선 할 수 있 습니다 . 정규 표현식 ( regular expression ) 이 라 불리 는 이 기능 은 , 텍스트 패턴 을 기술 하 기 위한 일종 의 표기법 으로 , 이미 오래 전 부터 다양 한 프로그래밍 언어 와 UNIX 유틸리티 를 통해 지원 되 어 왔 습니다 . 
 오라클 의 정규 표현식 은 SQL 함수 와 WHERE 절 연산자 의 형태 로 제공 됩니다 . 정규 표현식 에 익숙 하 지 않 은 독자 라면 , 이 문서 를 통해 전혀 새롭 고 강력 한 기능 을 체험 하 실 수 있 을 것 입니다 . 또 정규 표현식 에 이미 친숙 한 독자 분 들 은 , Oracle SQL 언어 의 문맥 에 이 기능 을 적용 하 는 방법 을 이해 하 는 기회 로 활용 하 실 수 있 습니다 . 
 정규 표현식 은 하나 또는 그 이상 의 문자열 과 메타 문자 ( metacharacter ) 로 구성 됩니다 . 가장 단순 한 형태 의 정규 표현식 은 cat 과 같 은 단 하나 의 문자열 로 만 구성 될 수 있 습니다 . 이 정규 표현식 은 문자 c 와 문자 a , 문자 t 의 순서 를 갖 는 패턴 매치 문자열 로 cat , location , catalog 등 의 문자열 과 매치 됩니다 . 메타 문자 는 정규 표현식 을 구성 하 는 문자 들 을 처리 하 는 방법 을 명시 하 기 위한 알고리즘 을 제공 합니다 . 다양 한 메타 문자 의 의미 를 이해 한다면 , 정규 표현식 이 텍스트 데이터 를 비교 하 고 대체 하 는 용도 로 매우 유용 하 게 활용 될 수 있 음 을 금방 깨닫 게 되 실 것 입니다 . 
 데이터 의 검증 , 중복 단어 의 확인 , 불 필요 한 공백 의 제거 , 문자 의 파싱 ( parsing ) 등 정규 표현식 의 활용 방법 은 실로 다양 합니다 . 정규 표현식 을 이용 하 여 전화 번호 , 우편 번호 , 이메일 주소 , 주민 등록 번호 , IP 주소 , 파일 이름 , 경로 이름 등 을 검증 할 수 도 있 습니다 . 또 HTML 태그 , 숫자 , 날짜 , 기타 특정 텍스트 데이터 와 일치 하 는 패턴 을 확인 하 고 다른 패턴 으로 대체 하 는 것 이 가능 합니다 . 
 Oracle Database 10 g 에서 정규 표현식 사용 하 기 
 오라클 에 새로 추가 된 기능 으로 Oracle SQL REGEXP _ LIKE 연산자 , REGEXP _ INSTR , REGEXP _ SUBSTR , REGEXP _ REPLACE 함수 등 이 있 습니다 . 이 함수 와 연산자 는 기존 의 LIKE 연산자 와 INSTR , SUBSTR , REPLACE 함수 를 보완 하 는 효과 를 제공 합니다 . 실제로 새로운 기능 들 은 기존 연산자 및 함수 와 유사 하 지만 훨씬 강력 한 패턴 매칭 환경 을 구현 하 고 있 습니다 . 검색 의 기준 이 되 는 데이터 는 간단 한 문자열 일 수 도 있 고 데이터베이스 테이블 의 문자 컬럼 에 저장 된 대량 의 텍스트 일 수 도 있 습니다 . 정규 표현식 을 이용 하 면 이전 에 는 생각 도 못했 던 유연 한 방법 으로 데이터 를 검색 , 대체 , 검증 할 수 있 습니다 . 
 정규 표현식 의 기본 적 예제 
 새로운 기능 을 사용 해 보 기 기 전 에 , 몇 가지 메타 문자 의 의미 를 이해 해 보 기 로 합시다 . 마침표 ( . ) 는 정규 표현식 에 존재 하 는 모든 문자 ( newline 제외 ) 와 매칭 됩니다 . 예 를 들 어 정규 표현식 a . b 는 문자 a , ( newline 을 제외 한 ) 임의 의 단일 문자 , 그리고 문자 b 의 순서 로 구성 된 문자열 과 매칭 됩니다 . 문자열 axb , xaybx , abba 는 모두 이 정규 표현식 에 정의 된 패턴 을 포함 하 고 있 으므로 매치 가 가능 합니다 . 라인 이 a 로 시작 하 여 b 로 끝 나 는 , 3 개 문자 로 구성 된 문자열 을 매칭 하 고자 하 는 경우 에 는 앵커 ( anchor ) 가 사용 되 어야 합니다 . 캐럿 ( ^) 메타 문자 는 라인 의 시작 을 , 달러 ( $) 기호 는 라인 의 끝 을 의미 합니다 ( 표 1 참고 ) . 따라서 정규 표현식 ^ a . b $ 는 aab , abb , axb 와 같 은 문자열 과 매칭 됩니다 . LIKE 연산자 에서 이 와 동일 한 기능 을 수행 하 려면 a _ b 패턴 을 사용 해야 합니다 . 여기 서 밑줄 기호 ( _) 는 단 문자 와일드카드 를 의미 합니다 . 
 기본 적 으로 , 정규 표현식 의 개별 문자 또는 문자 리스트 는 단 한 번 만 매칭 됩니다 . 정규 표현식 은 문자 가 여러 번 반복 출현 되 는 조건 을 지정 하 기 위한 ? 반복 연산자 ( repetition operator ) 를 제공 합니다 ( " quantifier " 라 부르 기 도 합니다 ) . 문자 a 로 시작 해서 b 로 끝 나 는 문자열 매칭 을 위한 정규 표현식 이 아래 와 같 습니다 : ^ a . * b $. * 메타 문자 는 임의 의 메타 문자 ( . ) 가 0 번 , 한 번 , 또는 여러 번 반복 되 는 조건 에 매칭 됩니다 . LIKE 연산자 에서 는 이 와 동일 한 연산자 로 a % b 를 지원 합니다 . 여기 서 퍼센트 ( %) 기호 는 임의 문자 가 0 번 , 한 번 , 또는 여러 번 반복 됨 을 의미 합니다 . 
 표 2 는 반복 연산자 의 전체 목록 을 보여 주 고 있 습니다 . 이 표 에 제시 된 예 를 통해 정규 표현식 이 기존 의 LIKE 와일드카드 문자 보다 훨씬 뛰어난 유연 성 을 제공 함 을 확인 할 수 있 습니다 . 표현식 에 괄호 를 씌우 는 경우 , 서브 표현식 ( subexpression ) 으로 활용 됩니다 . 서브 표현식 은 임의 의 횟수 만큼 반복 될 수 있 습니다 . 예 를 들 어 , 정규 표현식 b ( an ) * a 는 ba , bana , banana , yourbananasplit 등 과 매치 됩니다 . 
 오라클 의 정규 표현식 은 POSIX ( Portable Operating System Interface ) 문자 클래스 를 지원 합니다 ( 표 3 참고 ) . 따라서 검색 하 는 문자 의 유형 을 세부 적 으로 정의 하 는 것 이 가능 합니다 . 알파벳 이 아닌 문자 를 검색 하 는 조건 을 LIKE 연산자 로 작성 한다면 , WHERE 절 이 훨씬 복잡 한 형태 로 구현 되 어야 할 것 입니다 . 
 POSIX 문자 클래스 와 별도 로 , 개별 문자 를 문자 리스트 ( character list ) 에 포함 시키 는 기능 이 제공 됩니다 . 예 를 들 어 정규 표현식 ^ ab [ cd ] ef $ 는 문자열 abcef , abdef 와 매치 됩니다 . 여기 서 c 또는 d 두 개 의 문자 중 하나 가 사용 되 고 있 어야 합니다 . 
 문자 리스트 내부 에 위치 하 는 대부분 의 메타 문자 는 일반 문자 로 인식 됩니다 . 그 예외 가 캐럿 ( ^) 기호 와 하이픈 ( -) 기호 입니다 . 일부 메타 문자 는 문맥 에 따라 다른 의미 를 갖 습니다 . 이 때문 에 정규 표현식 이 무척 복잡 해 보일 수 도 있 습니다 . 캐럿 ^ 이 그 한 가지 예 입니다 . 이 기호 를 문자 리스트 의 첫 번 째 문자 로 사용 되 는 경우 에 는 , 문자 리스트 의 반대 조건 ( negation ) 을 의미 합니다 . 따라서 [ ^[: digit : ] ] 은 숫자 가 아닌 문자 로 구성 된 패턴 과 매칭 되 는 반면 ^[[: digit : ] ] 은 숫자 로 시작 되 는 패턴 과 매칭 됩니다 . 하이픈 ( -) 은 영역 ( range ) 을 의미 합니다 . 정규 표현식 [ a - m ] 은 a 와 m 사이 의 임의 의 문자 와 매칭 됩니다 . 하지만 [ - afg ] 의 경우 처럼 하이픈 이 문자 리스트 의 첫 번 째 문자 로 사용 된 경우 에 는 실제 하이픈 문자 를 의미 합니다 
 앞 에서 괄호 를 사용 하 여 서브 표현식 을 구현 하 는 방법 을 예시 한 바 있 습니다 . 서브 표현식 에서 는 수직 기호 ( |) 메타 문자 를 사용 하 여 여러 개 의 대체 문자 를 지정 할 수 있 습니다 . 
 예 를 들 어 , 정규 표현식 t ( a | e | i ) n 은 문자 t 와 n 사이 에 오 는 3 개 의 대체 문자 를 지정 하 고 있 습니다 . tan , ten , tin , Pakistan 등 의 문자열 은 매치 되 지만 teen , mountain , tune 등 은 매치 되 지 않 습니다 . 또 정규 표현식 t ( a | e | i ) n 을 문자 리스트 t [ aei ] n 으로 표현 할 수 도 있 습니다 . 표 4 는 이러 한 메타 문자 들 을 요약 하 고 있 습니다 . 지금 까지 설명 한 것 말 고 도 다양 한 메타 문자 가 있 지만 , 여기 에서 는 본 문서 에서 예제 로 사용 되 는 정규 표현식 을 이해 할 수 있 는 정도 만 이해 하 고 넘어가 기 로 합니다 . 
 REGEXP _ LIKE 연산자 
 REGEXP _ LIKE 오라클 데이터베이스 에 적용 가능 한 정규 표현식 기능 을 제공 합니다 . 표 5 는 REGEXP _ LIKE 의 문법 을 보여 주 고 있 습니다 
 아래 SQL 쿼리 의 WHERE 절 에서 사용 된 REGEXP _ LIKE 연산자 는 정규 표현식 [ ^[: digit : ] ] 을 만족 하 는 패턴 의 ZIP 컬럼 을 검색 하 고 있 습니다 . 이 조건 절 을 이용 하 여 , ZIPCODE 테이블 로부터 숫자 가 아닌 문자 를 포함 하 는 ZIP 컬럼 이 포함 된 모든 로우 를 가져올 수 있 습니다 . 
 이 정규 표현식 은 메타 문자 , 좀 더 정확히 말 하 면 콜론 과 대괄호 로 묶인 POSIX 문자 클래스 digit 만 을 사용 하 고 있 습니다 . [ ^[: digit : ] ] 에서 두 번 째 로 사용 된 대괄호 는 문자 클래스 리스트 를 묶 는 용도 로 사용 됩니다 . 앞 에서 설명 한 것 처럼 POSIX 는 문자 리스트 를 구성 하 는 용도 로 만 사용 되 므로 이 와 같 은 처리 가 필요 합니다 . 
 REGEXP _ INSTR 함수 
 좀 더 복잡 한 패턴 의 작성 
 앞 의 예의 우편 번호 패턴 을 확장 하 여 네 가지 숫자 를 포함 하 는 패턴 을 만들 어 보 기 로 합시다 . 새로 작성 된 패턴 이 아래 와 같 습니다 : 
 소스 문자열 이 5 개 숫자 로 종료 되 든 , 또는 " 5 개 숫자 + 4 자리 우편 번호 " 포맷 을 갖 든 , 패턴 의 시작 위치 를 얻 을 수 있 습니다 . 
 REGEXP _ SUBSTR 함수 
 REGEXP _ SUBSTR 함수 는 SUBSTR 함수 와 마찬가지 로 문자열 의 일부 를 추출 합니다 . 표 8 은 새로운 함수 의 사용법 을 설명 하 고 있 습니다 . 아래 예제 에서 는 [ ^,]*, 패턴 에 매치 되 는 문자열 이 반환 됩니다 . 정규 표현식 은 공백 에 이어 사용 된 쉼표 를 검색 하 고 , 쉼표 가 아닌 문자 가 0 회 또는 그 이상 반복 되 는 패턴 을 검색 ( [ ^,]*) 한 후 마지막 으로 또 다른 쉼표 를 검색 합니다 . 이 패턴 은 쉼표 로 구분 된 문자열 ( comma - separated values ) 과 유사 한 배열 을 갖 습니다 . 
 백 레퍼런스 ( Backreference ) 
 정규 표현식 의 유용 한 기능 의 하나 로 재 활용 을 위해 서브 표현식 을 저장 하 는 기능 이 제공 됩니다 . 이 기능 을 백 레퍼런스 ( backreferencing ) 라 부릅니다 ( 상세 한 설명 은 표 10 참고 ) . 백 레퍼런스 를 이용 하 여 패턴 을 새로운 위치 에 맞 교 체하 거나 반복 적 인 단어 또는 문자 를 검색 하 는 등 의 고급 대체 기능 을 구현 할 수 있 습니다 . 서브 표현식 과 일치 하 는 문자열 은 임시 버퍼 에 저장 됩니다 . 이 버퍼 에 는 왼쪽 에서 오른쪽 순서 로 숫자 가 매겨 지 며 \ digit 형태 로 표현 됩니다 . 여기 서 digit 은 1 과 9 사이 의 숫자 를 의미 하 며 각 숫자 에 해당 하 는 서브 표현식 과 매치 됩니다 . 
 아래 예제 는 서브 익스 프레 션 에 대한 백 레퍼런스 를 이용 하 여 Ellen Hildi Smith 라는 이름 을 Smith , Ellen Hildi 로 변환 하 고 있 습니다 . 
 위 의 SQL 구문 은 각각 괄호 로 묶인 3 개 의 서브 표현식 을 사용 하 고 있 습니다 . 각 서브 표현식 은 임의 의 단일 문자 와 매치 되 는 메타 문자 ( . ) 와 , 임의 의 문자 ( newline 제외 ) 와 0 회 또는 그 이상 매치 되 는 * 메타 문자 를 연이 어 사용 하 고 있 습니다 . 각 서브 표현식 사이 에 사용 된 공백 기호 역시 매치 되 어야 합니다 . 괄호 로 묶인 서브 표현식 에 의해 캡 처 된 값 은 \ digit 에 의해 참조 할 수 있 습니다 . 따라서 첫 번 째 서브 표현식 에 는 \ 1 이 , 두 번 째 표현식 에 는 \ 2 이 할당 됩니다 . 이 백 레퍼런스 들 은 함수 의 마지막 매개변수 ( \ 3 , \ 1 \ 2 ) 로 사용 되 어 , 서브 문자열 을 대체 하 고 ( 쉼표 와 공백 을 포함 하 는 ) 포맷 으로 표현 하 는 용도 로 활용 되 고 있 습니다 . 표 11 은 정규 표현식 의 개별 컴포넌트 에 대한 상세 정보 를 설명 하 고 있 습니다 . 
 백 레퍼런스 는 값 을 대체 , 포맷 하 는 용도 로 유용 하 게 활용 되 며 , 서로 인접 한 값 을 찾 기 위해 이용 할 수 도 있 습니다 . 다음 예제 는 REGEP _ SUBSTR 함수 를 이용 하 여 공백 기호 로 구분 된 알파벳 / 숫자 값 의 중복 사례 를 검색 하 고 있 습니다 . 이 함수 가 반환 된 서브 문자열 을 통해 is 문자열 이 반복 되 고 있 음 을 알 수 있 습니다 . 
 매치 매개변수 옵션 
 앞 에서 예시 한 예제 들 을 통해 정규 표현식 연산자 와 함수 에 매치 매개변수 ( match parameter ) 를 추가 적 으로 활용 할 수 있 음 을 눈치 채 셨 을 것 입니다 . 이 매개변수 는 대소문자 구분 , newline 문자 의 매치 , 멀티 라인 입력 의 보존 등 을 지원 합니다 . 
 정규 표현식 의 활용 사례 
 Y 정규 표현식 은 단순 쿼리 이외 에 도 PL / SQL 언어 처럼 SQL 연산자 , 함수 가 사용 되 는 경우 라면 언제 든 적용 이 가능 합니다 . 또 정규 표현식 을 이용 하 여 값 의 검증 , 생 성 , 추출 을 위한 기능 을 트리거 형태 로 구현 할 수 있 습니다 . 
 다음 예제 는 입력 된 데이터 에 대해 컬럼 제약 조건 을 검증 하 기 위해 REGEXP _ LIKE 연산자 를 사용 하 는 방법 을 예시 하 고 있 습니다 . 이 쿼리 는 INSERT , UPDATE 작업 이 발생 하 는 경우 입력 이 사회 보장 번호 의 포맷 과 일치 하 는지 확인 합니다 . 123 - 45 - 6789 또는 123456789 과 같 은 포맷 으로 표현 된 사회 보장 번호 는 컬럼 의 제약 조건 을 만족 합니다 . 데이터 는 3 개 의 숫자 로 시작 하 여 하이픈 으로 연결 된 후 , 다시 두 개 의 숫자 , 하이픈 , 마지막 으로 4 개 의 숫자 로 표현 됩니다 . 또는 사회 보장 번호 를 9 개 의 연속 적 숫자 로 표현 하 는 것 도 가능 합니다 . 수직 기호 ( |) 는 두 가지 옵션 중 선택 이 가능 함 을 의미 합니다 . 
 ^, $. 기호 는 가장 앞 에 또는 가장 뒤 에 오 는 문자 를 무시 할 것 을 지정 하 고 있 습니다 . 정규 표현식 이 두 개 이상 의 라인 으로 분절 되 거나 표현식 에 불 필요 한 공백 기호 가 포함 되 지 않 도록 주의 하 시 기 바랍니다 . 표 12 는 위 정규 표현식 예제 에서 사용 된 각각 의 컴포넌트 에 대해 설명 하 고 있 습니다 . 
 정규 표현식 과 기존 SQL 기능 의 비교 
 정규 표현식 은 기존 에 사용 되 던 LIKE 연산자 와 INSTR , SUBSTR , and REPLACE 함수 와 비교 했 을 때 여러 가지 이점 을 제공 하 고 있 습니다 . 기존 의 SQL 함수 는 패턴 매칭 을 전혀 지원 하 지 않 고 있 습니다 . 문자 의 매칭 을 지원 하 는 컴포넌트 는 LIKE 연산자 가 유일 하 며 % , _ 와일드카드 문자 가 지원 됩니다 . 하 지만 LIKE 연산자 는 표현식 의 반복 , 복잡 한 대체 패턴 , 문자 영역 , 문자 리스트 , POSIX 문자 클래스 등 을 지원 하 지 않 습니다 . 또 새로운 정규 표현식 함수 는 반복 단어 와 패턴 의 맞교환 ( swap ) 을 지원 한다는 장점 이 있 습니다 . 본 문서 에서 제시 된 예제 들 이 정규 표현식 의 개념 과 활용 방법 을 이해 하 는 데 도움 이 되 었 기 바랍니다 . 
 툴킷 확장 을 위한 유용 한 도구 
 정규 표현식 은 복잡 한 문제 의 해결 을 가능 하 게 하 는 매우 강력 한 기능 입니다 . 정규 표현식 은 기존 SQL 함수 로 는 흉내내 기 어려운 다양 한 기능 을 지원 합니다 . 정규 표현식 의 사용법 이 다소 복잡 해 보이 기 는 하 지만 , 그 기본 적 인 구성 요소 만 익혀도 SQL 뿐 아니 라 다른 프로그래밍 언어 에서 도 유용 한 도구 로 활용 하 실 수 있 을 것 입니다 . 원 하 는 패턴 을 얻 기 위해서 는 여러 차례 의 시행착오 가 불가피 할 수 도 있 습니다 . 하지만 어느 누구 도 정규 표현식 의 우아 함 과 강력 한 기능 을 결코 무시 할 수 없 을 것 입니다 . 
 Alice Rischert ( ar 280 @ yahoo . com ) 는 콜럼 비아 대학 컴퓨터 테크놀로지 / 애플리케이션 프로그램 의 데이터베이스 애플리케이션 개발 / 설계 트랙 담당 회장 입니다 . 그녀 는 < Oracle SQL Interactive Workbook 2 nd edition ( Prentice Hall , 2002 ) > 과 조만간 출판 예정 인 < Oracle SQL by Example ( Prentice Hall , 2003 ) > 의 저자 이 기 도 합니다 . Rischert 는 포춘 100 대 기업 에서 데이터베이스 설계 , DBA , 프로젝트 리더 로 15 년 간 의 경력 을 보유 하 고 있 으며 오라클 데이터베이스 는 버전 5 부터 사용 해 온 베테랑 입니다 . 
 표 1 : 메타 문자 의 앵커 ( anchor ) 적용 
 라인 의 시작 부분 에 표현식 을 적용 
 라인 의 끝 부분 에 표현식 을 적용 
 표 2 : 반복 연산자 ( Repetition Operator , Quantifier ) 
 0 회 또는 그 이상 횟수 로 매치 
 0 회 또는 1 회 매치 
 1 회 또는 그 이상 횟수 로 매치 
 정확히 m 회 매치 
 최소한 m 회 매치 
 최소 m 회 , 최대 n 회 매치 
 표 3 : 사전 정의 된 POSIX 문자 클래스 
 알파벳 문자 
 소문자 알파벳 문자 
 대문자 알파벳 문자 
 출력 되 지 않 는 공백 문자 ( 예 : carriage return , newline , vertical tab , form feed 등 
 구두점 기호 
 ( 출력 되 지 않 는 ) 컨트롤 문자 
 출력 가능 한 문자 
 표 4 : 대체 매칭 및 표현식 의 그룹 화 
 대체 문자 를 구분 ( 그룹 핑 연산자 ( ) 와 함께 사용 하 기 도 함 ) 
 반복 연산자 또는 백 레퍼런스 ( backreference ) 를 위해 대체 유닛 을 서브 표현식 으로 그룹 화 ( " 백 레퍼런스 " 섹션 참고 ) 
 I 문자 리스트 . 문자 리스트 내부 에 위치 하 는 대부분 의 메타 문자 는 일반 문자 로 인식 됨 . 그 예외 가 캐럿 ( ^) 기호 와 하이픈 ( -) 기호 
 표 5 : REGEXP _ LIKE 연산자 
 source _ string 은 문자 데이터 타입 지원 ( CHAR , VARCHAR 2 , CLOB , NCHAR , NVARCHAR 2 , NCLOB 단 LONG 은 제외 ) . pattern 매개변수 는 정규 표현식 을 참조 하 는 또 다른 이름 . 옵션 으로 제공 되 는 match _ parameter 를 이용 하 여 newline 문자 의 처리 , 멀티 라인 포맷 의 유지 , 대소문자 구분 등 을 처리 할 수 있 음 . 
 표 6 : REGEXP _ INSTR 함수 
 pattern 을 검색 하 여 패턴 의 첫 번 째 위치 를 반환 . 필요 한 경우 start _ position y 을 이용 하 여 검색 을 시작 할 위치 를 지정 할 수 있 음 . occurrence 매개변수 는 같 은 패턴 을 여러 번 검색 하 고자 하 는 경우 에 사용 ( 디폴트 는 1 ) . return _ option 은 패턴 의 시작 위치 를 반환 ( 디폴트 값 은 0 ) . 1 로 설정 되 는 경우 매치 된 패턴 의 다음 문자 위치 를 반환 . 
 표 7 : 5 자리 숫자 + 4 자리 Zip - Code 표현식 에 대한 설명 
 매치 되 어야 하 는 빈 공백 
 POSIX " numeric digit " 클래스 
 문자 리스트 ( character list ) 의 끝 
 문자 리스트 에 대해 정확히 5 회 반복 
 서브 표현식 ( subexpression ) 의 시작 부분 
 하이픈 ( -) 문자 ( 문자 리스트 내 의 range 메타 문자 로 사용 되 지 않 았 음 에 주의 ) 
 문자 리스트 의 시작 부분 
 POSIX [ : digit : ] 클래스 
 문자 리스트 의 끝 부분 
 문자 리스트 를 정확히 4 회 반복 
 서브 표현식 을 묶 는 괄호 기호 
 ? 반복 연산자 는 그룹 핑 된 서브 표현식 을 0 회 또는 1 회 매치 하 여 옵션 으로 4 자리 코드 를 사용 할 수 있 게 함 
 검색 위치 를 라인 의 끝 부분 으로 지정 하 기 위한 앵커 메타 문자 
 표 8 : The REGEXP _ SUBSTR 함수 
 REGEXP _ SUBSTR 함수 는 패턴 애 매치 되 는 서브 문자열 을 반환 . 
 표 9 : TheREGEXP _ REPLACE 함수 
 매치 된 패턴 을 지정 된 replace _ string 으로 대체 하 고 , 복잡 한 검색 / 대체 작업 을 가능 하 게 하 는 함수 . 
 표 10 : 백 레퍼런스 메타 문자 ( Backreference Metacharacter ) 
 백 슬래시 뒤 에 1 - 9 사이 의 숫자 를 명시 하 여 , 괄호 처리 된 N 번 째 서브 표현식 을 참조 하 기 위해 사용 . 
 ( 참고 : 백 슬래시 는 정규 표현식 에서 다른 의미 로 사용 되 기 도 함 . 문맥 에 따라 Escape 문자 를 의미 할 수 도 있 음 . 
 표 11 : 패턴 - 스왑 ( Pattern - Swap ) 정규 표현식 의 설명 
 정규 표현식 아이템 
 첫 번 째 서브 표현식 의 시작 
 ( newline 을 제외 한 ) 임의 의 단일 문자 와 매치 
 반복 연산자 - 앞 의 . 메타 문자 와 0 회 에서 n 회 까지 매치 
 첫 번 째 서브 표현식 의 마지막 . 매치 결과 는 \ 1 
 에 캡 처 됨 ( 예제 에서 는 Ellen 을 캡처 ) 
 공백 기호 
 두 번 째 서브 표현식 의 시작 
 newline 을 제외 한 임의 의 단일 문자 와 매치 
 에 캡 처 됨 ( 예제 에서 는 Hildi 를 저장 ) . 
 세 번 째 서브 표현식 의 시작 
 세 번 째 서브 표현식 의 끝 부분 . 매치 결과 는 \ 3 
 에 캡처 ( 예제 에서 는 Smith 를 저장 ) . 
 표 12 : Social Security Number 정규 표현식 의 설명 
 라인 문자 의 시작 ( 정규 표현식 은 매치 되 기 이전 의 문자 를 가져 올 수 없 음 . ) 
 서브 표현식 을 시작 하 고 | 메타 문자 를 이용 하 여 대체 목록 을 제공 
 문자 리스트 ( character list ) 의 시작 
 문자 리스트 를 정확 하 게 3 회 반복 적용 
 문자 리스트 의 시작 
 POSIX numeric digit 클래스 
 문자 리스트 를 정확 하 게 2 회 반복 적용 
 또 다른 하이픈 기호 
 문자 리스트 를 정확 하 게 4 회 반복 적용 
 대체 ( alternation ) 메타 문자 - 첫 번 째 선택 을 종료 하 고 두 번 째 대체 표현식 을 시작 
 POSIX numeric digit 클래스 . 
 문자 리스트 를 정확 하 게 9 회 반복 
 대체 를 위해 사용 된 서브 표현식 그룹 을 종료 하 는 괄호 기호 
 라인 의 끝 부분 을 의미 하 는 앵커 메타 문자 ( 매치 된 패턴 이후 에 어떤 문자 도 뒤따라 올 수 없 음 ) 
 출처 : http : / / zoot 235 . egloos . com / 10088226 
 정규 표현식 ( regexp ) ( 0 ) 
 JAVA 정규 표현식 ( 0 ) 
 2017 . 05 . 19 17 : 26 IT / JAVA 
 JAVA 정규 표현식 
 1 ) ‘.’ 특수 문자 
 - 임의 의 한 문자 를 나타낸다 . 
 - ‘.’ 특수 문자 가 위치 한 곳 에 는 반드시 한 글자 가 위치 하 여야 한다 . 
 - ex ) 패턴 : a . b → 일치 하 는 문자열 : acb , adb , azb 등 
 - ex ) 패턴 : ab . → 일치 하 지 않 는 경우 : ab , abcd 등 
 2 ) ‘*’ 특수 문자 
 - 바로 앞 의 문자 를 0 번 이상 반복 한다 . 
 - * 앞 에 는 한 글자 이상 의 단어 가 반드시 와야 한다 . 
 - ex ) 패턴 : ab * c → abc , abbc , abbbc 등 
 - ex ) 패턴 : * ab → 불 가능 
 3 ) ‘+’ 특수 문자 
 - 바로 앞 의 문자 를 1 번 이상 반복 한다 . 
 - + 앞 에 는 한 글자 이상 의 단어 가 반드시 와야 한다 . 
 - ex ) 패턴 : a + b → aab , aaab , aaaab 등 
 - ex ) 패턴 : + ab → 불 가능 
 4 ) ‘?’ 특수 문자 
 - 특수 문자 바로 앞 의 문자 가 하나 있 거나 없 는 것 을 의미 한다 . 
 - ex ) 패턴 : try ? → 일치 하 는 문자열 : tr , try 
 패턴 : a ? c → 일치 하 는 문자열 : c , ac 
 5 ) ‘^’ 특수 문자 
 - 문장 의 처음 을 나타낸다 . 
 - ex ) 패턴 : ^ Hello → 일치 하 는 문자열 : Hello abc , Hello world 등 
 Hello 로 시작 하 는 문자열 
 6 ) ‘$’ 특수 문자 
 - 문장 의 끝 을 나타낸다 . 
 - ex ) 패턴 : world $ → 일치 하 는 문자열 : hello world , welcome my world 등 
 world 로 끝 나 는 문자열 
 7 ) ‘[]’ 특수 문자 
 - 괄호 안 의 문자 중 일치 하 는 것 을 찾 고자 할 경우 사용 
 - ex ) 패턴 : [ abc ] → 일치 하 는 문자열 : a , b , c , ab , abc 등 
 [ a - z ] → 소문자 가 포함 된 모든 문자열 
 [ A - Z ] → 대문자 가 포함 된 모든 문자열 
 [ 0 - 9 ] → 숫자 가 포함 된 모든 문자열 
 ^[ a - zA - Z 0 - 9 ] → 숫자 가 영문자 로 시작 되 는 모든 문자열 
 8 ) ‘[]’ 특수 문자 안 에서 의 ‘^’ 특수 문자 
 - [ ] 안 의 문자 와 일치 하 지 않 는 문자열 을 포함 하 고 있 는 패턴 을 의미 한다 
 - ex ) 패턴 : [^ abc ] de → . de 패턴 과 동일 ( ade , bde , cde 제외 ) 
 - 특수 문자 앞 의 문자 나 문자열 의 반복 되 는 개수 를 말 한다 . 
 10 ) ‘()’ 특수 문자 
 - ( ) 안 의 글자 들 을 하나 의 문자 로 본다 . 
 ( hero _)* → null , hero _, hero _ hero _ 등 
 11 ) ‘|’ 특수 문자 
 - 패턴 안 에서 OR 연산 사용 시 사용 
 - ex ) man | woman → man , woman , manwoman , superman 등 
 12 ) 문자 클래스 
 - [ ] 안 에서 자주 사용 되 는 패턴 들 을 미리 키워드 로 정의 하 여 놓 은 것 
 - 문자 클래스 는 PHP 에서 는 이용 되 지만 JAVA 에서 는 이용 되 지 않 음 
 J 2 SDK 1 . 4 의 예 
 [ a - zA - Z ] : 모든 영문자 
 [ 0 - 9 ] : 숫자 
 [ a - zA - Z 0 - 9 ] : 영문자 와 숫자 
 javascript 에서 사용 ! !! 
 # 매칭 문자 
 \ D : 숫자 가 아닌 문자 
 \ w : [ A - Z , a - z , 0 - 9 ] , 알파벳 , 숫자 로 된 문자 , 밑줄 기호 
 \ W : \ w 를 제외 한 것 
 flag - i : 대 / 소문자 구분 없 음 
 g : 전역 검색 
 m : 여러 줄 검색 
 정규식 매칭 중 ( ) 사용 시 괄호 로 묶 은 패턴 은 매칭 후 그 부분 을 기억 하 여 결과 가 저장 되 는 배열 에 같이 저장 된다 . 
 괄호 로 묶 은 부분 만 저장 된다 . 
 ex 3 ) 숫자 에 Comma 추가 하 기 ( 출처 : 바로 가 기 >> ) 
 출처 : http : / / breath 91 . tistory . com / entry / Java - 정규 표현식 [ 숨 [ Breath ] ] 
 경제 	 ( 141 ) 
 부동산 ( 104 ) 
 Total 116 , 403 
 부동산 관리 . FM , PM , AM . . 
 복 을 부르 는 풍수 인테리어 . .