기타 정규식(정규 표현식, Regular Expression)
페이지 정보
본문
정규식(정규 표현식, Regular Expression)은 텍스트에서 특정 패턴을 찾기 위해 사용하는 문자열입니다. 컴퓨터 과학에서 널리 사용되는 이 툴은 복잡한 검색과 문자열 치환 작업을 간편하게 수행할 수 있게 해줍니다. 여러 프로그래밍 언어 및 텍스트 편집 도구에서 지원합니다. 정규식의 기본 구성 요소
정규식의 활용 예시
1. 이메일 주소 검증
2. URL 유효성 검사
3. 전화번호 형식 확인
4. 비밀번호 복잡성 검사
5. 코드에서 주석 제거
6. HTML 태그 제거
주의사항정규식은 매우 강력하지만, 오용하면 의도치 않은 결과를 초래할 수 있습니다. 복잡하고 긴 정규식은 가독성을 저하시키고, 유지보수가 어려울 수 있습니다. 따라서 간결하고 명확한 패턴 설계가 중요합니다. 정규식은 다양한 프로그래밍 언어 및 도구에서 필수적인 요소로 자리 잡고 있습니다. 그 효용성 덕분에 데이터 검증, 처리, 분석 작업에서 빈번히 사용됩니다. |
일단 정규식이라 함은 다들 아시겠지만 문자열이 특정한 패턴에 해당하는지 검사하거나 특정 패턴을 가진 부분을
추출하기 위해서 사용합니다.
문자열을 파싱해서 할 수도있지만 비용이 많이 드는 반면에 정규식을 사용하면 정확하고 빠르게 수행을 할 수 있고,
다른 많은 언어에서도 지원을 하니 뭐 많이들 사용하시는 자바스크립트 등에서 효과적으로 사용할 수 있는 장점이 있을 것 같고요...
정규식 문법을 알아야 한다는 단점이 있을 거 같습니다.
일단 정규식은 공식적으로 jdk 1.4 버전 이상에서 사용할 수 있습니다.
그래서... 가장 큰 장점은 자바 api에서 공식 지원하므로 까다로운 메서드나 클래스를 만들지않고 바로 사용할 수 있다는 점을 꼽고 싶습니다.
정규식은 자바 예약어와 같은 역할을 하는 특수문자들이 있습니다.
정규식을 보면 첨에 보면 좀 당황하게 되는 부분이 괄호였습니다. 괄호의 쓰임새를 보겠습니다.
괄호는 (), {}, [] 일케 3 종류를 씁니다.
()는 괄호 안에 있는 문자나 문자열을 하나의 문자처럼 취급을 합니다.
예를 들어 (aa) 일케 하면 꼭 aa 라는 것이죠~~
{}는 괄호 앞에 있는 문자의 반복횟수를 나타냅니다.
{2}는 문자가 두번 반복된다. {2,}는 문자가 두번 이상 반복된다. {2, 5}는 문자가 2번 이상 5번 이하로 반복된다.
(aa)하고 a{2} 하고는 같은 패턴인 것을 알 수 있습니다.
[]는 하나의 문자를 나타냅니다. char 라고 보셔도 무관할 거 같습니다.
근데 []는 범위를 줄 수도 있습니다. 범위를 주는 방법은 두가지가 있습니다.
첫번째는 [aeho] 이런 방식입니다. 이것은 어떤 한 문자가 'a' or 'e' or 'h' or 'o' 라는 것을 나타냅니다.
두번째는 -를 사용하는 방법입니다. [a-d] 일케하면 'a' or 'b' or 'c' or 'd' 라는 것을 나타냅니다.
이 두가지 방식을 함께 사용할 수도 있는데...[a-zA-Z] 일케하면 다들 아시겠지만...
영문자를 나타냅니다.
그렇다면 괄호를 함께 사용해서 (kor[1-3]{2,}ea){2} 이런 정규식은 kor22eakor312ea 와 같은 문자열을 나타낼 수 있겟죠...
[]괄호의 안에있는 범위중 특정한 것들을 골라서 미리 정해놓은 것이 있습니다. 이것이 '정규식 클래스'입니다.
[a-zA-Z] == \p{Alpha}, [0-9] == \p{Digit}, [ \t\n\x0B\f\r] == \p{Space} 등등... api에 자세히 나와있습니다.
다음으로 기호를 보겠습니다.
일단 .(쩜) 입니다.
.(쩜)은 하나의 문자를 나타냅니다. a.b 라는 패턴은 a랑 b사이에 하나의 문자가 꼭 있어야 한다는 패턴입니다.
a..b는 a랑 b사이에 꼭 두개의 문자가 있어야 한다는 패턴이 됩니다.
근데 우낀건 이 .(쩜) 자체를 나타낼려면 특수문자 이므로 \를 붙여줘야 하는데
이 .(쩜)이 [] 안에 쓰이면 즉 [.] == \. 이 되어버립니다. 즉 . != \. == [.] == [\.] 이라는 얘기지요
이유는 모르겠지만... [] 자체가 하나의 케릭터를 나타내기 때문에 [.]도 .(쩜) 문자로 취급을 하는 거 같습니다.
아까 위에서 a[.]b하면 a랑 b사이에 꼭 .(쩜) 문자가 있어야 한다는 패턴이라는 얘기지요. 즉 a/.b == a[.] 가 됩니다.
^ 문자는 문자열의 맨앞을 나타냅니다. ^Aeho 하면 문자열이 Aeho로 시작한다는 패턴이 됩니다.
이 ^가 []안에 쓰이면 not(!)의 의미를 같습니다. [^a-zA-Z] 는 영문자가 아니다 라는 패턴이 됩니다.
$ 문자는 문자열의 끝을 나타냅니다. Aeho$ 하면 문자열이 Aeho로 끝난다는 패턴이 됩니다.
| 문자는 or를 나타냅니다. |문자 자체를 나타낼려면 \|를 해야 합니다.
흔희 String 클래스의 split() 메서드가 제대로 안짤릴 때가 있다는 사람들이 있습니다.
그래서 StringTokenizer객체를 사용하고는 하던데요... 잘못된 정규식 사용 때문이라고 생각합니다.
split()은 인자로 정규식 패턴을 받고 StringTokenizer 는 실제 문자열을 구분자의 인자로 받습니다. 실재로 이들은 기능이 좀 다릅니다. 각각의 사용 용법이 다르다고 생각합니다. String.split()이 제대로 동작하지 않는다면 api 그것도 java.lang.String클래스에 멤서드로 등록이 되있을 수가 없을 것입니다...ㅋㅋ
"ab|cd|ef" 라는 문자열을 split("|") 하게되면 배열이 a,b,c,d,e,f 로 짤릴 것입니다. split("\\|") 하게되면 ab, cd, ef 로 짤릴 것입니다. 이유는 다들 잘 아실겁니다.
스플릿이 잘 짤릴 때도 있고 안될 때도 있다고 하시는 사람들은 대부분 그 구분자를 정규식에서 사용하는 특수
문자(대표적으로 |)를 사용할려고 하기때문에 또 그 때 \를 잘 사용을 하지 않아서 그런 경우라고 생각합니다.
String 클래스에 있는 trim() 메서드를 정규식으로 구현한다면...
public String trim() {
return this.str.replaceAll("^\\p{Space}|\\p{Space}$", "");
} 정도가 되지 않을까 싶습니다. 아님 말고요...ㅋㅋ
다음은... 반복 횟수를 나타내는 기호들입니다.
* 기호는 앞에있는 패턴이 0번 이상 출현함을 나타냅니다. ".*" 은 모든 문자열을 나타냅니다.
+ 기호는 앞에있는 패턴이 1번 이상 출현함을 나타냅니다. {1,} 이 녀석이랑 같은 의미가 될 거 같습니다.
? 기호는 앞에있는 패턴이 0 or 1 번 출현함을 나타냅니다. {0, 1} 이 녀것이 되겠네요.
이 정도만 알면 정규식을 읽고 쓸 수 있었습니다....ㅋㅋ, 더이상 알고 싶지않습니다.
필요하다면 api에 자세히 나와있죠... 역시 공식지원이라 좋군요...ㅎㅎ
이 번에는 정규식 그룹을 보겠습니다. 그룹은 api 보면 설명이 나왔습니다만...
()의 중복된 순서를 나타냅니다. 예를 들어 (A)(B(C)) 이와같은 패턴이 있다면...괄호가 열려진 순서대로 그룹의 번호가 정해집니다. group(0) 번은 항상 패턴 전체를 나타냅니다. group(1)은 (A) 패턴입니다. group(2)은 (B(C)) 가 되고, group(3) 은 (C) 이 됩니다.
이 그룹은 java.util.regex.Matcher 클래스를 이용하여 사용할 수 있는데요...
예를 들어 어떤 문자열이 있는데... 그 전체 문자열 중에서 url 정보를 가져오고 나서 실제로 그 url의 프로토콜을 알아보고자 한다면 프로토콜 부분의 패턴을 ()로 묶어주면 group(1) 을 이용하여 가져올 수 있게 됩니다.
다른 쓸 말이 많지만... 일단 이 정도만 정리해 보겠습니다.
힘드네요... 헉헉...
- 이전글VB.NET 마스터하기: 효율적인 Extension 메서드 사용법 24.04.17
- 다음글[VB.NET] 파일 저장 시 유효하지 않은 파일명에 대한 특수 문자 처리 및 복구 방법 24.04.17
댓글목록
등록된 댓글이 없습니다.