충돌 과정
Steven A. Smith
2004년 3월
적용 대상:
Microsoft .NET Framework
Microsoft ASP.NET
정규식 API
요약: 정규식은 텍스트로 작업할 때 매우 유용한 도구입니다. 사용자 입력의 유효성을 검사해야 하거나, 문자열 내의 패턴을 검색해야 하거나, 효과적으로 텍스트 서식을 다시 지정해야 할 경우 정규식을 사용하면 좋습니다(14페이지/인쇄 페이지 기준).
이 기사의 소스 코드를 다운로드하십시오.
목차
소개
정규식 개요
단순식
한정사
메타 문자
문자 클래스
미리 정의된 메타 문자 집합
샘플 식
ASP.NET의 유효성 검사
정규식 API
무료 도구
고급 항목
결론
리소스
저자 소개
소개
Microsoft.NET Framework에서는 정규식을 완벽하게 지원하며, Microsoft ASP.NET 내에도 정규식 언어를 사용하는 컨트롤이 있습니다. 이 기사에서는 정규식의 기본 정보와 함께 자세한 내용을 참조할 수 있는 추가 정보를 다룹니다.
이 기사는 정규식에 대해서는 잘 몰라도 ASP.NET 및 .NET의 프로그래밍에는 익숙한 초급자를 위해 쓰여졌습니다. 이전에 정규식을 사용해 본 개발자들도 정규식 요약 과 함께 이 기사를 편리하게 참조하고 정보를 새롭게 상기할 수 있기를 바랍니다. 이 기사에서는 다음 내용을 다룹니다.
- 정규식 개요
- 단순식
- 한정사
- 메타 문자
- 문자 클래스
- 미리 정의된 메타 문자 집합
- 샘플 식 세부 정보
- ASP.NET의 유효성 검사
- 정규식 API
- 무료 도구
- 고급 항목 개요
- 요약 및 추가 리소스
이 기사나 정규식에 대한 일반적인 의문 사항이 있을 경우 350명 이상의 가입자를 보유한 http://www.aspadvice.com/ 의 regex 메일 그룹 에서 질문하십시오.
정규식 개요
오늘날 사용되는 정규식은 1950대에 고안되었습니다. 원래 정규식은 신경 생리학자들의 연구 시 패턴이었던 "정규 집합"을 설명하는 데 사용되었습니다. 최초로 정규식을 만든 사람은 수학자 Stephen Kleene입니다. 이후에 Ken Thompson은 매우 일반적인 텍스트 유틸리티인 QED 및 GREP에 정규식을 도입했습니다. Jeffrey Friedl은 그의 저서 Mastering Regular Expressions(2판)에서 더 심도 있게 다루었습니다. 정규식의 이론과 개요에 대해 자세히 배우려는 분들께 이 책을 권장합니다.
지난 50년 동안 정규식은 불명확한 수학적 개념에서 많은 도구와 소프트웨어 패키지의 주요 기능으로 서서히 변화해 왔습니다. 수십 년 동안 많은 UNIX 도구에서 정규식을 지원했지만 정규식이 대부분의 Windows 개발자 도구 키트로서 제대로 자리잡기 시작한 것은 10년 정도 밖에 되지 않았습니다. Microsoft Visual Basic 6 또는 Microsoft VBScript에서는 정규식을 사용하기가 다소 불편했지만 새로 출시된 .NET Framework에서는 정규식을 완벽하게 지원하게 되어 모든 Microsoft 개발자가 모든 .NET 언어에 정규식을 사용할 수 있게 되었습니다.
그러면 정규식이란 무엇일까요? 정규식은 텍스트 문자열에서 패턴을 명시적으로 설명하는 데 사용할 수 있는 언어입니다. 이러한 패턴을 단순히 설명하는 것 외에도 일반적으로 정규식 엔진을 사용하면 일치 항목을 반복하거나 패턴을 구분 기호로 사용하여 문자열을 하위 문자열로 구문 분석하거나 지능적인 방식으로 텍스트를 바꾸거나 형식을 다시 지정할 수 있습니다. 또한 정규식을 사용하여 강력하고 간단한 방식으로 텍스트 처리와 관련된 많은 일반 작업을 해결할 수 있습니다.
정규식에 대해 설명할 때는 정규식과 일치하거나 일치하지 않는 텍스트를 기준으로 분석하는 것이 일반적입니다. 이 기사와 System.Text.RegularExpressions 클래스에서는 정규식 상호 작용의 3가지 항목인 정규식 패턴, 입력 문자열 및 패턴이 문자열 내에 만드는 일치에 대해 설명하도록 하겠습니다.
단순식
가장 단순한 정규식은 이미 친숙해 있는 정규식인 리터럴 문자열입니다. 특정 문자열을 문자 그대로 설명할 수 있으므로 foo와 같은 정규식 패턴은 입력 문자열 foo와 정확히 한 번 일치합니다. 이러한 경우 이 문자열은 The food was quite tasty 입력과도 일치합니다. 그러나 정확히 일치하는 항목만 찾을 경우 이 입력을 원하지 않을 수 있습니다.
물론 자신과 정확히 일치하는 문자열을 찾는 것은 일반적인 정규식 구현의 결과일 뿐 강력한 기능이라고 말할 수는 없습니다. foo 대신 f로 시작하는 모든 단어를 찾으려는 경우 또는 3자로 된 단어를 찾으려는 경우는 어떨까요? 이 정도 조건이라면 이미 리터럴 문자열로 수행할 수 있는 작업의 범위는 넘어 선 것입니다. 이제 정규식에 대해 더 자세히 배워야 합니다. 다음은 샘플 리터럴 표현식 및 일치하는 일부 입력입니다.
패턴 |
입력(일치 항목) |
foo |
foo, food, foot, "There's evil afoot." |
한정사
한정사를 사용하면 패턴 내에 특정 문자 또는 문자 집합을 반복할 수 있는 횟수를 간단히 지정할 수 있습니다. 다음과 같은 3가지 비명시적 한정사가 있습니다.
- *는 "0개 이상의 항목"을 나타냅니다.
- +는 "1개 이상의 항목"을 나타냅니다.
- ?는 "0개 또는 1개의 항목"을 나타냅니다.
한정사는 항상 한정사 바로 앞(왼쪽)에 있는 패턴을 참조합니다. 패턴 그룹을 만드는 데 괄호가 사용되지 않은 경우 이 한정사는 일반적으로 단일 문자입니다. 다음은 몇 가지 샘플 패턴 및 일치하는 입력입니다.
패턴 |
입력(일치 항목) |
fo* |
foo, foe, food, fooot, "forget it", funny, puffy |
fo+ |
foo, foe, food, foot, "forget it" |
fo? |
foo, foe, food, foot, "forget it", funny, puffy |
주어진 패턴이 정확히 0번 또는 한 번 발생할 수 있도록 지정하는 것 외에도 ? 문자는 입력 문자열에서 여러 개가 일치할 수 있을 경우 패턴 또는 하위 패턴이 최소 문자 수와 일치하도록 지정합니다.
비명시적 한정사(일반적으로 간단히 한정사라고 하지만 다음 그룹과 구분하기 위함) 외에도 명시적 한정사가 있습니다. 한 가지 패턴으로 발생할 수 있는 횟수와 관련하여 한정사가 모호할 경우 명시적 한정사를 사용하면 정확한 수, 범위 또는 숫자 집합을 지정할 수 있습니다. 정규 한정사와 같이 명시적 한정사는 적용되는 패턴 다음에 위치합니다. 명시적 한정사는 중괄호{} 및 숫자 값을 사용하여 이 괄호 안에 상한 및 하한 발생 수를 지정합니다. 예를 들어 x{5}는 x 문자 5개(xxxxx)와 일치합니다. 숫자 한 개만 지정한 경우 x{5,}와 같이 뒤에 쉼표를 입력하지 않는 한 상한으로 사용됩니다(개수에 상관없이 4개 이상의 x 문자와 일치).
패턴 |
입력(일치 항목) |
ab{2}c |
abbc, aaabbccc |
ab{,2}c |
ac, abc, abbc, aabbcc |
ab{2,3}c |
abbc, abbbc, aabbcc, aabbbcc |
메타 문자
정규식에서 특별한 의미가 있는 구성을 메타 문자라고 합니다. 앞서*, ?, +, { } 문자 등의 여러 메타 문자에 대해 이미 살펴 보았습니다. 기타 여러 문자는 정규식의 언어로 특별한 의미가 있습니다. 이러한 문자에는 $ ^ . [ ( | ) ] \ 등이 있습니다.
.(마침표 또는 점) 메타 문자는 가장 단순하면서도 가장 많이 사용되는 문자 중 하나입니다. 이 문자는 어떤 단일 문자와도 일치하며, 특정 패턴에 문자 조합이 포함될 수 있지만 한정사를 사용하여 특정 길이 범위 내에 속하도록 지정하는 데 유용합니다. 또한 긴 문자열 내에서 설명하는 패턴의 인스턴스에 식이 일치하는 것도 살펴 보았습니다. 그러나 패턴과 정확히 일치하도록 하려면 어떻게 해야 할까요? 이러한 경우는 우편 번호나 전화 번호에 적합한 형식으로 입력했는지 확인하는 경우와 같이 유효성 검사 시나리오에 자주 일어납니다. ^ 메타 문자는 문자열 또는 줄의 처음을 지정하는 데 사용되며 $ 메타 문자는 문자열이나 줄의 끝을 지정하는 데 사용됩니다. 이러한 문자를 패턴의 처음과 끝에 추가하면 패턴에 정확히 일치하는 입력 문자열에만 일치하도록 할 수 있습니다. 또한 ^ 메타 문자는 대괄호 [ ]로 지정되는 문자 클래스의 처음에 사용될 경우 특별한 의미가 있습니다. 이 내용은 아래에서 설명하겠습니다.
\(백슬래시) 메타 문자는 문자가 특별한 의미를 가지지 않도록 하는 데 사용되며 미리 정의된 메타 문자 집합의 인스턴스를 지정하는 데 사용됩니다. 이 내용도 아래에서 설명하겠습니다. 정규식이 메타 문자의 리터럴 버전을 포함하도록 하려면 백슬래시를 사용하여 특정 의미를 해제해야 합니다. 그러므로 인스턴스에 대해 "c:\"로 시작하는 문자열과 일치시키려는 경우 ^c:\\를 사용할 수 있습니다. 여기서 ^ 메타 문자를 사용하여 문자열이 이 패턴으로 시작되도록 지정했으며 백슬래시 메타 문자를 사용하여 리터럴 백슬래시를 해제했다는 점에 유의하십시오.
|(파이프) 메타 문자는 교체에 사용되며 기본적으로 패턴에서 'A 또는 B'를 지정합니다. 그러므로 a|b와 같은 입력은 'a' 또는 'b'가 포함된 어떤 내용에도 일치하며 문자 클래스 [ab]와 매우 비슷합니다.
마지막으로, 괄호 ( )는 패턴을 그룹화하는 데 사용됩니다. 가독성만을 위해 한정사를 사용하여 전체 패턴이 여러 번 발생하도록 허용하거나 입력의 특정 부분이 개별적으로 일치하도록 하여 서식을 다시 지정하거나 구문 분석을 수행하기 위해 패턴을 그룹화할 수 있습니다.
다음은 메타 문자 사용의 예를 보여 줍니다.
패턴 |
입력(일치 항목) |
. |
a, b, c, 1, 2, 3 |
.* |
Abc, 123, 모든 문자열, 심지어 문자가 없어도 일치 |
^c:\\ |
c:\windows, c:\\\\\, c:\foo.txt, c:\ 다음에 오는 임의의 문자 |
abc$ |
abc, 123abc, abc로 끝나는 모든 문자열 |
(abc){2,3} |
abcabc, abcabcabc |
문자 클래스
문자 클래스는 대괄호 [ ]로 둘러 쌓여 정의되는 것으로, 정규식 내의 소언어입니다. 가장 단순한 문자 클래스는 [aeiou]와 같이 단순히 괄호 안에 있는 문자 목록입니다. 식 안에 사용할 경우 이러한 문자 중 하나를 패턴 내의 이 위치에 사용할 수 있습니다. 그러나 한정사를 사용하지 않을 경우에 한하여 한 번만 사용할 수 있습니다. 문자 클래스를 사용할 경우 단어나 패턴은 정의할 수 없으며 단일 문자만 정의할 수 있습니다.
숫자를 지정하려면 문자 클래스 [0123456789]를 사용할 수 있습니다. 그러나 이렇게 길게 쓰면 오히려 사용하기 불편할 수 있으므로 하이픈 문자(-)를 사용하여 괄호 안에 문자 범위를 정의할 수 있습니다. 이 하이픈 문자는 문자 클래스에서만 특별한 의미가 있을 뿐 정규식에서는 별다른 의미가 없으므로 정규식 메타 문자로 정확히 한정하지는 않습니다. 또한 문자 클래스에서도 첫 문자가 아닌 경우에만 특별한 의미가 있습니다. 하이픈을 사용하여 숫자를 지정하려면 [0-9]를 사용합니다. 마찬가지로 소문자의 경우 [a-z]를 사용하고 대문자의 경우 [A-Z]를 사용하면 됩니다. 하이픈으로 정의되는 범위는 사용 중인 문자 집합에 따라 다르므로 ASCII 또는 유니코드 테이블 등에서의 문자 순서는 해당 범위에 포함되는 문자를 결정합니다. 범위에 하이픈을 포함해야 할 경우에는 첫 문자로 지정합니다. 예를 들어 [-.? ]는 이 4개 문자 중 하나와 일치합니다(마지막 문자는 공백). 또한 정규식 메타 문자는 문자 클래스 내에서 특별하게 처리되지 않으므로 의미를 해제할 필요가 없습니다. 문자 클래스는 고유 규칙과 구문을 사용하므로 나머지 정규식과는 다른 별도의 언어로 간주해야 합니다.
또한 문자 클래스에서 캐럿(^)을 첫 문자로 사용하여 문자 클래스를 빼면 문자 클래스의 구성원을 제외하고 임의의 문자를 일치시킬 수 있습니다. 그러므로 모음이 아닌 문자를 일치시키려면 [^aAeEiIoOuU]와 같은 문자 클래스를 사용할 수 있습니다. 하이픈을 빼려는 경우 [^-]과 같이 문자 클래스에서 두 번째 문자로 입력해야 합니다. 문자 클래스에서 ^ 문자는 정규식 패턴의 첫 문자로 사용할 때와 전혀 다른 의미를 가진다는 점에 유의하십시오.
다음은 사용 중인 문자 클래스의 예를 보여 줍니다.
패턴 |
입력(일치 항목) |
^b[aeiou]t$ |
Bat, bet, bit, bot, but |
^[0-9]{5}$ |
11111, 12345, 99999 |
^c:\\ |
c:\windows, c:\\\\\, c:\foo.txt, c:\ 다음에 오는 임의의 문자 |
abc$ |
abc, 123abc, abc로 끝나는 모든 문자열 |
(abc){2,3} |
abcabc, abcabcabc |
^[^-][0-9]$ |
0, 1, 2, … (-0, -1, -2 등과 일치하지 않음) |
다음 버전의 .NET Framework에서 새 기능인 코드 이름 "Whidbey"가 문자 클래스 빼기라는 문자 클래스에 추가될 예정입니다. 기본적으로 이 기능을 사용하면 한 문자 클래스에서 다른 문자 클래스를 뺄 수 있으므로 일부 패턴을 보다 편리하게 설명할 수 있습니다. 이 지정 사항은 현재 http://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/CharacterClassSubtraction.doc 에서 볼 수 있습니다. 모든 소문자와 일치하는 구문은 [a-z-[aeiou]]와 같습니다.
미리 정의된 메타 문자 집합
지금까지 설명한 도구를 사용하여 수많은 작업을 수행할 수 있습니다. 그러나 패턴에서 모든 숫자에 대해 [0-9]라고 사용하는 것도 길다고 볼 수 있으며 영숫자 문자에서 [0-9a-zA-Z]와 같이 사용할 경우에는 더 불편합니다. 이와 같이 일반적이지만 매우 긴 패턴의 불편함을 없애기 위해 메타 문자 집합을 미리 정의했습니다. 정규식을 다르게 구현하면 미리 정의된 메타 문자 집합도 다르게 정의됩니다. 여기서 설명하는 메타 문자 집합은 .NET Framework의 System.Text.RegularExpressions API에서 지원됩니다. 미리 정의된 이러한 메타 문자의 표준 구문은 백슬래시(\) 다음에 하나 이상의 문자를 입력하는 것입니다. 대부분의 미리 정의된 메타 문자 길이는 문자 하나이므로 쉽게 사용할 수 있고 긴 문자 클래스 대신에 편리하게 사용할 수 있습니다. 두 가지 예로, 임의의 숫자와 일치하는 \d와 단어 문자(영숫자와 밑줄)와 일치하는 \w가 있습니다. 유니코드 캐리지 리턴 문자와 일치하는 \u000D와 같이, 일치하는 문자의 주소를 지정해야 하는 특수 문자 코드 일치는 예외입니다. 가장 일반적으로 사용하는 문자 클래스와 해당 메타 문자는 다음과 같습니다.
메타 문자 |
해당 문자 클래스 |
\a |
벨(경보)과 일치합니다. \u0007 |
\b |
문자 클래스 안에 사용되는 경우를 제외하고 단어 경계와 일치합니다. 백슬래시 문자 \u0008과 일치합니다. |
\t |
탭과 일치합니다. \u0009 |
\r |
캐리지 리턴과 일치합니다. \u000D |
\w |
세로 탭과 일치합니다. \u000B |
\f |
용지 공급과 일치합니다. \u000C |
\n |
새 행과 일치합니다. \u000A |
\e |
이스케이프와 일치합니다. \u001B |
\040 |
세 자리 8진수를 사용하는 ASCII 문자와 일치합니다. \040은 공백을 나타냅니다(십진수 32). |
\x20 |
두 자리 16진수를 사용하는 ASCII 문자와 일치합니다. 이 경우 \x2-는 공백을 나타냅니다. |
\cC |
ASCII 컨트롤 문자와 일치합니다. 이 경우 ctrl-C입니다. |
\u0020 |
정확히 4자리 16진수를 사용하는 유니코드 문자와 일치합니다. 이 경우 \u0020은 공백입니다. |
\* |
미리 정의된 문자 클래스를 나타내지 않는 문자는 단순히 해당 문자로 처리됩니다. 그러므로 \*는 \x2A와 같습니다(*는 메타 문자가 아니라 리터럴임). |
\p{name} |
명명된 문자 클래스 'name'에 있는 임의의 문자와 일치합니다. 지원되는 이름은 유니코드 그룹 및 블록 범위입니다. 예를 들어 Ll, Nd, Z, IsGreek, IsBoxDrawing 및 Sc(통화)와 같습니다. |
\P{name} |
명명된 문자 클래스 'name'에 포함되지 않은 텍스트와 일치합니다. |
\w |
임의의 단어 문자와 일치합니다. 비유니코드 및 ECMAScript 구현의 경우 [a-zA-Z_0-9]와 같습니다. 유니코드 범주에서는 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]와 같습니다. |
\W |
\w를 빼고, ECMAScript 규격 집합 [^a-zA-Z_0-9] 또는 유니코드 문자 범주 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]와 같습니다. |
\s |
공백 문자와 일치합니다. 유니코드 문자 클래스 [\f\n\r\t\v\x85\p{Z}]와 같습니다. ECMAScript 옵션을 사용하여 ECMAScript 규격 동작을 지정한 경우 \s는 [ \f\n\r\t\v](선행 공백이 있음)와 같습니다. |
\S |
공백이 아닌 문자와 일치합니다. 유니코드 문자 범주 [^\f\n\r\t\v\x85\p{Z}]와 같습니다. ECMAScript 옵션을 사용하여 ECMAScript 규격 동작을 지정한 경우 \S는 [^ \f\n\r\t\v](^ 다음에 공백이 있음)와 같습니다. |
\d |
십진수와 일치합니다. 유니코드의 경우 [\p{Nd}]와 같고, 비유니코드 ECMAScript 동작의 경우 [0-9]와 같습니다. |
\D |
십진수가 아닌 숫자와 일치합니다. 유니코드의 경우 [\P{Nd}]와 같고, 비유니코드 ECMAScript 동작의 경우 [^0-9]와 같습니다. |
샘플 식
대부분의 경우 예를 들어 설명할 때 가장 효과적으로 이해할 수 있으므로 여기서 몇 가지 샘플 식을 보여 드리겠습니다. 더 많은 샘플 식을 보려면 온라인 정규식 라이브러리 http://www.regexlib.com/ 을 방문하십시오.
패턴 |
설명 |
^\d{5}$ |
미국 우편 번호와 같은 5자리 숫자입니다. |
^(\d{5})|(\d{5}-\d{4}$ |
5자리 숫자 또는 5자리 숫자-대시-4자리 숫자입니다. 미국 우편 번호 또는 미국 우편 번호+4 형식과 일치합니다. |
^(\d{5}(-\d{4})?$ |
앞의 예와 같지만 더 효율적입니다. ?를 사용하면 교체를 통해 별도의 패턴 두 개를 개별적으로 비교해야 하는 대신에 패턴의 4자리 부분을 선택적으로 입력할 수 있습니다. |
^[+-]?\d+(\.\d+)?$ |
실수와 일치하며 선택적으로 기호를 사용할 수 있습니다. |
^[+-]?\d*\.?\d*$ |
위의 예와 같지만 빈 문자열에도 일치합니다. |
^(20|21|22|23|[01]\d)[0-5]\d$ |
24시간 값과 일치합니다. |
/\*.*\*/ |
C 스타일 주석 /* … */의 내용과 일치합니다. |
ASP.NET의 유효성 검사
ASP.NET에서는 이전 ASP(또는 클래식 ASP)를 사용할 때보다 훨씬 쉽게 웹 양식 입력의 유효성을 검사하는 유효성 검사 컨트롤 집합을 제공합니다. 가장 강력한 유효성 검사기 중 하나는 RegularExpressionValidator입니다. 이 검사기는 입력과 일치해야 하는 정규식을 제공하여 입력의 유효성을 검사할 수 있습니다. 정규식 패턴은 컨트롤의 ValidationExpression 속성을 설정하여 지정합니다. 다음은 우편 번호 필드의 유효성 검사기 예를 보여 줍니다.
<asp:RegularExpressionValidator runat="server" id="ZipCodeValidator"
ControlToValidate="ZipCodeTextBox" ErrorMessage="잘못된 우편 번호입니다.
format; format should be either 12345 or 12345-6789."
ValidationExpression="(\d{5}(-\d{4})?" />(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)
다음은 RegularExpressionValidator에 대해 알아 두어야 할 사항입니다.
- 유효성 검사 중인 컨트롤에서 빈 문자열로 활성화할 수 없습니다. RequiredFieldValidator에서만 빈 문자열을 인식합니다.
- 문자열의 처음과 끝에 일치 문자 ^ 및 $가 가정되므로 따로 지정할 필요가 없습니다. 하지만 단지 불필요한 것일 뿐 이 문자를 추가해도 손상되거나 변경되는 것은 없습니다.
- 모든 유효성 검사 컨트롤과 마찬가지로 이 유효성 검사는 클라이언트 쪽과 서버 쪽 모두에서 수행됩니다. 정규식이 ECMAScript 규격이 아닌 경우 클라이언트에서 실패합니다. 이 문제를 방지하려면 식이 ECMAScript 규격인지 확인하거나 서버에서만 유효성 검사를 수행하도록 컨트롤을 설정합니다.
정규식 API
ASP.NET 유효성 검사 컨트롤을 제외하고 .NET에서 정규식을 사용하는 대부분의 경우 System.Text.RegularExpressions 네임스페이스에 있는 클래스를 사용합니다. 특히 잘 알고 있어야 하는 주요 클래스는 Regex, Match 및 MatchCollection입니다.
중요하지 않은 문제이지만, 정규식의 약어인 regex를 /reg-eks/로 발음할 것인지 또는 /rej-eks/로 발음할 것인지에 관한 란이 있습니다. 개인적으로 후자를 선호하지만 두 가지 경우 모두 전문가들이 주장하고 있으므로 원하는 발음을 사용하면 됩니다.
Regex 클래스에는 풍부한 메서드와 속성이 있습니다. 이전에 이 클래스를 사용해 본 적이 없을 경우 약간 어렵다고 생각할 수도 있을 것입니다. 다음은 가장 자주 사용되는 메서드를 요약한 것입니다.
메서드 |
설명 |
Escape / Unescape |
식에서 리터럴로 사용하기 위해 문자열에서 메타 문자 의미를 해제합니다. |
IsMatch |
입력 문자열에서 일치하는 항목을 찾을 경우 True를 반환합니다. |
Match |
입력 문자열에서 일치하는 항목을 찾을 경우 Match 개체를 반환합니다. |
Matches |
입력 문자열에서 찾은 일치 항목이 모두 포함된 MatchCollection 개체를 반환합니다. |
Replace |
입력 문자열에서 일치하는 항목을 지정된 바꾸기 문자열로 바꿉니다. |
Split |
입력 문자열을 regex 일치 항목으로 구분하여 배열 요소로 나눔으로써 문자열 배열을 반환합니다. |
많은 메서드 외에도, 주로 Regex 개체의 생성자에서 지정할 수 있는 수많은 옵션이 있습니다. 이러한 옵션은 비트 마스크의 일부이므로 OR를 사용할 수 있습니다. 즉, Multiline과 Singleline을 동시에 사용할 수 있습니다.
옵션 |
설명 |
Compiled |
루프에서 많은 일치 작업을 수행할 경우 이 옵션을 사용합니다. 이 옵션을 사용하면 각 반복 작업에서 식의 구문 분석 단계를 줄일 수 있습니다. |
Multiline |
입력 문자열에 몇 줄이 있는지와 아무 상관이 없습니다. 오히려 이 옵션은 단순히 ^ 및 $의 동작을 수정하므로 전체 입력 문자열의 시작과 끝 대신 BOL 및 EOL과 일치합니다. |
IgnoreCase |
패턴에서 검색 문자열을 일치시킬 때 대/소문자를 무시합니다. |
IgnorePatternWhitespace |
패턴에 원하는 수만큼 공백을 넣을 수 있으며 (?# comment #) 구문을 사용하여 패턴 내 주석을 사용할 수 있게 합니다. |
SingleLine |
입력 문자열에 몇 줄이 있는지와 아무 상관이 없습니다. 오히려 .(마침표) 메타 문자가 \n을 제외하고 모든 문자와 일치(기본값)하는 대신, 임의의 문자와 일치하도록 만듭니다. |
정규식을 사용할 수 있는 몇 가지 일반적인 작업에는 유효성 검사, 일치 및 바꾸기가 있습니다. 대부분의 경우 이 작업은 Regex 클래스의 정적 메서드를 사용하여 수행할 수 있으며 Regex 클래스 자체를 인스턴스화할 필요가 없습니다. 유효성 검사를 수행하려면 올바른 식을 만들거나 찾아서 Regex 클래스의 IsMatch() 메서드를 사용하여 입력 문자열에 적용하기만 하면 됩니다. 예를 들어 다음 함수는 정규식을 사용하여 우편 번호의 유효성을 검사하는 방법을 보여 줍니다.
private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
String ZipRegex = @"^\d{5}$";
if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
{
ResultLabel.Text = "우편 번호가 유효합니다!";
}
else
{
ResultLabel.Text = "우편 번호가 잘못되었습니다!";
}
}
마찬가지로, 다음과 같이 정적 Replace() 메서드를 사용하여 일치하는 항목을 특정 문자열로 바꿀 수 있습니다.
String newText = Regex.Replace(inputString, pattern, replacementText);
마지막으로, 다음과 같은 코드를 사용하여 입력 문자열에서 일치하는 항목 집합을 반복할 수 있습니다.
private void MatchButton_Click(object sender, System.EventArgs e)
{
MatchCollection matches = Regex.Matches(SearchStringTextBox.Text,
MatchExpressionTextBox.Text);
MatchCountLabel.Text = matches.Count.ToString();
MatchesLabel.Text = "";
foreach(Match match in matches)
{
MatchesLabel.Text += "Found " + match.ToString() + " at
position " + match.Index + ".<br>";
}
}
기본 동작 외에 다른 동작을 지정해야 할 경우 일반적으로 Regex 클래스의 인스턴스를 인스턴스화해야 합니다. 특히 설정 옵션의 경우가 그렇습니다. 예를 들어 대/소문자와 패턴 공백을 무시하는 Regex 인스턴스를 만들고 해당 식에 대해 일치하는 항목 집합을 검색하려면 다음 코드를 사용합니다.
Regex re = new Regex(pattern,
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);
이 샘플의 전체 작업 버전은 다운로드한 이 기사에 단순 ASP.NET 페이지로 포함되어 있습니다.
무료 도구
Regulator(http://royo.is-a-geek.com/iserializable/regulator/ ) - 클라이언트 쪽에서 실행하도록 만들어진 정규식 테스트 도구로서, 웹 서비스를 통해 RegexLib과 통합되며 일치, 분할, 바꾸기 등을 지원합니다. 성능 분석 및 구문 강조가 포함됩니다.
RegexDesigner.NET(http://www.sellsbrothers.com/tools/ ) - 정규식을 구성하고 테스트할 수 있는 강력한 비주얼 도구입니다. C# 및/또는 VB.NET 코드 및 컴파일된 어셈블리를 생성하여 식을 응용 프로그램에 쉽게 통합할 수 있게 합니다.
Regular Expression Workbench v2.0(http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=C712F2DF-B026-4D58-8961-4EE2729D7322 ) - 정규식을 만들고 테스트하고 연구할 수 있는 Eric Gunnerson의 도구입니다. 마우스로 regex를 가리켜 그 의미를 디코딩할 수 있는 "Examine-o-matic" 기능이 들어 있습니다.
고급 항목
여기서 주목할 만한 두 가지의 정규식 기능은 명명된 그룹 및 둘러보기 처리(lookaround processing)입니다. 하지만 이 두 가지 항목은 자주 사용되는 것이 아니므로 여기서는 간략하게만 설명하겠습니다.
명명된 그룹을 사용할 경우 일치하는 개별 그룹에 이름을 지정하고 식 내에서 프로그래밍 방식으로 이러한 그룹을 참조할 수 있습니다. 입력 문자열에서 요소의 순서와 배치를 다시 정렬하여 입력 문자열의 서식을 바꿀 때 Replace 메서드와 함께 사용하면 특히 유용합니다. 예를 들어 MM/DD/YYYY 문자열 형식으로 지정된 날짜를 DD-MM-YYYY 형식으로 바꾸려는 경우를 가정해 봅니다. 첫 번째 형식을 캡처하고 해당 Matches 컬렉션을 반복한 다음 문자열 처리를 사용하는 식을 써서 바꾸기 문자열을 만들 수 있습니다. 이 식에는 어느 정도의 코드 및 처리가 필요합니다. 명명된 그룹을 사용하여 이와 같은 작업을 수행할 수 있습니다.
String MDYToDMY(String input)
{
return Regex.Replace(intput, @"\b(?<month>\d{1,2})/(?<day>\d{1,2}/(?<year>\d{4})\b", "${day}-
${month}-${year}");
}
또한 이름뿐 아니라 번호로도 그룹을 참조할 수 있습니다. 모든 이벤트에서 이러한 참조를 역참조라고 합니다. 또한 일반적으로 역참조는 반복되는 문자를 찾기 위한 [a-z]\1 식과 같이 일치하는 식 자체 내에서 많이 사용됩니다. 이 식은 'aa', 'bb', 'cc' 등과는 일치하지만 'ab', 'ac' 등 모든 두 글자 조합에 해당하거나 이를 허용하는 [a-z]{2} 또는 [a-z][a-z]와는 다릅니다. 역참조를 사용하면 식에서 이미 구문 분석하고 일치시킨 입력 문자열의 일부에 대해 기억할 수 있습니다.
"둘러보기 처리"는 많은 정규식 엔진에서 지원하는 긍정적, 부정적 예측 및 분석 기능을 참조합니다. 모든 정규식 엔진에서 둘러보기 처리의 모든 변형을 지원하는 것은 아닙니다. 이 구성은 문자와 일치할 수 있지만 문자를 사용하지는 않습니다. 일부 패턴은 둘러보기 처리를 사용하지 않고 설명할 수 없습니다. 특히 패턴 일부의 존재가 다른 부분의 존재에 따라 결정되는 경우에는 더욱 그렇습니다. 각 둘러보기 기능의 구문은 다음과 같습니다.
구문 |
설명 |
(?=…) |
긍정적 예측(Positive Lookahead) |
(?!...) |
부정적 예측(Negative Lookahead) |
(?<=…) |
긍정적 분석(Positive Lookbehind) |
(?<!...) |
부정적 분석(Negative Lookbehind) |
둘러보기 처리를 사용해야 하는 경우의 예로는 암호 유효성 검사가 있습니다. 적어도 숫자가 하나 이상 포함된 4자에서 8자 사이의 암호를 입력해야 하는 암호 제한을 가정해 봅니다. 일치 항목에 대해 \d를 테스트하고 문자열 작업을 사용하여 길이를 테스트함으로써 이 작업을 수행할 수 있지만 정규식에서 전체를 수행하려면 둘러보기가 필요합니다. 다음 식이 나타내는 것과 같이 특히 긍정적 예측의 경우 더욱 그렇습니다. ^(?=.*\d).{4,8}$
결론
정규식을 사용하면 텍스트의 패턴을 효과적으로 설명할 수 있으므로 문자열 유효성 검사와 처리를 위한 리소스로 활용할 수 있습니다. .NET Framework는 System.Text.RegularExpressions 네임스페이스를 비롯하여, 특히 Regex 클래스에서 정규식을 완벽하게 지원합니다. API는 사용하기가 간편하지만 올바른 정규식을 사용하는 것이 때로는 어려운 일입니다. 다행히 정규식은 재사용률이 매우 높으며 많은 온라인 리소스에서 다른 사용자가 지정한 식을 찾아서 활용할 수도 있고, 만들기 어려운 정규식에 대해 도움도 받을 수 있습니다.
리소스
정규식 라이브러리 http://www.regexlib.com/
정규식 토론 목록 http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&l=68&c=16
정규식 포럼 http://forums.regexadvice.com/
정규식 웹 로그 http://blogs.regexadvice.com/
Jeffrey Friedl의 Mastering Regular Expressions(O'Reilly) http://www.regex.info/
.NET 정규식 참조 http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp
Jscript 정규식 구문 http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp
정규식 정보 http://www.regular-expressions.info/
저자 소개
Microsoft ASP.NET MVP인 Steven A. Smith는 ASPAlliance.com 및 DevAdvice.com의 사장이자 소유자입니다. 또한 .NET 중심 교육 기관인 ASPSmith Ltd의 소유자이자 대표 강사로, MSDN 및 AspNetPRO 잡지에 실리는 기사뿐 아니라 ASP.NET Developer's Cookbook과 ASP.NET By Example 두 권의 책을 저술한 바 있습니다. 또한 매년 열리는 여러 회의에서 강연을 맡고 있고 INETA 강연자 협회의 회원이며, 경영학 석사 및 컴퓨터 과학 기술 학사 학위를 소지하고 있습니다.
전자 메일(ssmith@aspalliance.com)을 통해 저자와 연락할 수 있습니다.