|
패턴 | 입력(일치 항목) |
---|---|
foo | foo, food, foot, "There's evil afoot." |
한정사를 사용하면 패턴 내에 특정 문자 또는 문자 집합을 반복할 수 있는 횟수를 간단히 지정할 수 있습니다. 다음과 같은 3가지 비명시적 한정사가 있습니다.
한정사는 항상 한정사 바로 앞(왼쪽)에 있는 패턴을 참조합니다. 패턴 그룹을 만드는 데 괄호가 사용되지 않은 경우 이 한정사는 일반적으로 단일 문자입니다. 다음은 몇 가지 샘플 패턴 및 일치하는 입력입니다.
패턴 | 입력(일치 항목) |
---|---|
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(또는 클래식 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에 대해 알아 두어야 할 사항입니다.
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/
[이 자료는 MSDN Library에서 가져왔습니다.]
|
첫댓글 선생님 잘보고 갑니다.ㅎ