2019. 2. 12. 11:04

닷넷(.NET)에서의 정규표현식 사용하기

요소설명
. \n(new line) 문자를 제외한 모든 문자
\d 10진수
\D 10진수가 아닌 문자
\s 공백문자
\S 공백문자가 아닌 문자
\w 알파벳이나 한글 및 숫자 같은 문자
\W 문자가 아닌 것
^ 문자열이나 줄의 시작
\A 일치하는 부분이 문자열의 시작에 있어야 함
$ 문자열이나 줄의 끝
\z 일치하는 부분이 문자열의 끝에 있어야 함
| 파이프로 구분된 값들 중 일치하는 하나를 찾음. This|That|What 는 This나 That, What중 하나가 있을 경우 일치하게 됨
[abc] 대괄호 안의 문자 중 일치하는 하나를 찾음. [QwEr]은 Q, w, E, r 중 하나가 있을 경우 일치하게 됨
[^abc] ^기호 뒤에 오는 문자가 아닌 문자를 찾음. [^QwEr]은 a나b는 찾지만 Q나 w는 찾지 못함
[a-z] 지정된 문자 범위 내에 있는 문자를 찾음. [A-C]는 A, B, C를 찾음
( ) 정규표현식 내부의 또 다른 부분 정규표현식을 나타냄
? ?앞의 식이 있거나 없을 수 있음
* *앞의 식이 0번 이상 올 수 있음
+ *앞의 식이 1번 이상 올 수 있음
{n} {n}앞의 식이 n개인 경우를 찾음
{n,} {n}앞의 식이 최소한 n개인 경우를 찾음
{n, m} {n, m}앞의 식이 최소 n개에서 최대 m개인 경우를 찾음


입력 값 정규표현식 설명
숫자 ^\d+$ 문자가 아닌 숫자
단순비밀번호 ^\w{6,8}$ 6~8자리까지의 문자(숫자 포함) 비밀 번호를 검사함
신용카드번호 ^\d{4}-?\d{4}-?\d{4}-?\d{4}$ 4자리 숫자가 4번 반복. 하이픈(-)은 없을수도 있음
주민등록번호 ^\d{6}-?\d{7}$ 6자리 숫자와 7자리 숫자의 가운데에 하이픈(-)이 들어감
이메일 ^[\w-]+@([\w-]+\.)+[\w-]+$ 이메일 주소를 검사함
URL ^https?://([\w-]+\.)+[\w-]+(/[\w-./?&%=]*)?$ URL을 검사함

위의 정규표현식 중 그나마 가장 복잡해 보이는 URL을 분석해 보고 정규표현식에 조금 적응을 해 보도록 하겠습니다.

URL 정규표현식 패턴(^https?://([\w-]+\.)+[\w-]+(/[\w-./?&%=]*)?$) 분석

  1. ^는 문자열이나 줄의 시작을 나타냅니다.
  2. http는 리터럴로 순수 http라는 문자에 대응합니다. 1과 2를 함께 보면 입력된 문자는 http로 시작해야 한다는 것을 의미합니다.
  3. s?는 리터럴 s가 있거나 없을 수도 있음을 나타냅니다. 즉 http 또는 https로 문자열이 시작된다는 것을 의미합니다.
  4. ://는 단순 리터럴입니다.
  5. ([\w-]+\.)+는 \w(문자)나 하이픈(-)이 한번 이상 반복된 다음 마침표(.)가 나옵니다. 즉, www. 또는 w. 또는 mobile-. 등이 될 수 있습니다. 그리고 이것이 괄호로 묶여 있고 +가 있으므로 이 전체가 한번 이상 반복될 수 있습니다. ex) www.dayofdays. 또는 www.taeyo.
  6. [\w-]+는 문자 및 하이픈(-)이 한번 이상 반복될 수 있음을 의미합니다.
    ex)www.dayofdays.net 또는 www.taeyo.net
  7. 마지막으로 (/[\w-./?&%]*)?$는 문자(\w)나 하이픈(-) 또는 마침표(.), 슬래시(/). 물음표(?), 앰퍼센드(&), 퍼센트(%)중 한가지가 0번 이상(*)올 수 있으며 이 문자열의 앞에 리터럴 /가 오며 이 전체((/[\w-./?&%]*))가 있어도 없어도(?)되며 문자열이나 줄의 끝($)이어야 합니다. 즉 /talk/board.aspx?no=1&page=2와 같은 문자열을 검사합니다.
대괄호[] 안에 문자를 지정하는 경우 해당 문자들을 중 하나와 일치하는 값을 찾아내므로 .이나 ?가 역슬래쉬(\)없이 사용되었지만 메타문자가 아닌 일반 문자로 취급됩니다.

하나하나씩 분석해 보면 그다지 어렵지 않으며 순차적으로 해석하되 []를 먼저 해석하고 ()를 해석한 다음 전체를 보면 좀 더 쉽게 이해할 수 있습니다.

Regex 클래스를 사용하여 유효성 검사 수행

앞에서 정규표현식을 생성하였으므로 이제 Regex 클래스를 사용하여 실제 유효성 검사를 수행해보도록 하겠습니다. Regex 개체는 Regex 생성자에 정규표현식을 매개변수로 전달하여 만들 수 있습니다. 개체를 생성했으면 Regex 개체의 IsMatch 메서드를 사용하여 검사를 수행할 수 있습니다. IsMatch 메서드는 검사할 문자열을 매개변수로 취합니다. IsMatch 메서드는 전달한 문자열이 정규표현식과 일치한다면 true를 반환하고 그렇지 않다면 false를 반환하게 됩니다. 코드는 다음과 같습니다.

public static bool Validate(string regexString, string inputValue)
{
    Regex regex = new Regex(regexString);
    return r.IsMatch(inputValue);
}

위 메서드의 실행 결과는 다음과 같습니다.

Validate(“^\d+$”, ”12345”); //true를 반환
Validate(“^\d+$”, ”12345A”); //false 반환

다양한 문자열을 검사하기 위해 Regex 개체를 반복적으로 사용할 수 있습니다. 그러나 Regex 개체에 할당된 정규표현식은 생성자를 통해 할당하였고 별도의 속성을 제공하지 않기 때문에 교체할 수 없습니다. Regex 개체를 재사용할 수 없으므로 새로운 정규표현식을 사용하기 위해서는 매번 Regex 개체를 생성해야 합니다. 이는 그다지 훌륭한 방법이 아닐 수 있습니다. 이런 경우 보다 적절한 대안은 IsMatch 메서드의 오버로드로 제공되는 static 메서드를 사용하는 것입니다

public static bool Validate(string regexString, string inputValue)
{
    return Regex.IsMatch(regexString, inputValue);
}

앞에서 설명한 두 방법은 Regex개체가 사용될 때 마다 런타임이 정규표현식을 중간 형식(Intermediate form, opcode)으로 변경(interpret)한 다음 대상 문자열에 적용합니다. 이로 인한 문제점 및 해결을 위한 방법을 다음 글에서 알아보도록 하겠습니다.

 감사합니다.


(http://taeyo.net 참조문건)