요소 | 설명 |
. | \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-./?&%=]*)?$) 분석
- ^는 문자열이나 줄의 시작을 나타냅니다.
- http는 리터럴로 순수 http라는 문자에 대응합니다. 1과 2를 함께 보면 입력된 문자는 http로 시작해야 한다는 것을 의미합니다.
- s?는 리터럴 s가 있거나 없을 수도 있음을 나타냅니다. 즉 http 또는 https로 문자열이 시작된다는 것을 의미합니다.
- ://는 단순 리터럴입니다.
- ([\w-]+\.)+는 \w(문자)나 하이픈(-)이 한번 이상 반복된 다음 마침표(.)가 나옵니다. 즉, www. 또는 w. 또는 mobile-. 등이 될 수 있습니다. 그리고 이것이 괄호로 묶여 있고 +가 있으므로 이 전체가 한번 이상 반복될 수 있습니다. ex) www.dayofdays. 또는 www.taeyo.
-
[\w-]+는 문자 및 하이픈(-)이 한번 이상 반복될 수 있음을 의미합니다.
ex)www.dayofdays.net 또는 www.taeyo.net - 마지막으로 (/[\w-./?&%]*)?$는 문자(\w)나 하이픈(-) 또는 마침표(.), 슬래시(/). 물음표(?), 앰퍼센드(&), 퍼센트(%)중 한가지가 0번 이상(*)올 수 있으며 이 문자열의 앞에 리터럴 /가 오며 이 전체((/[\w-./?&%]*))가 있어도 없어도(?)되며 문자열이나 줄의 끝($)이어야 합니다. 즉 /talk/board.aspx?no=1&page=2와 같은 문자열을 검사합니다.
하나하나씩 분석해 보면 그다지 어렵지 않으며 순차적으로 해석하되 []를 먼저 해석하고 ()를 해석한 다음 전체를 보면 좀 더 쉽게 이해할 수 있습니다.
Regex 클래스를 사용하여 유효성 검사 수행
앞에서 정규표현식을 생성하였으므로 이제 Regex 클래스를 사용하여 실제 유효성 검사를 수행해보도록 하겠습니다. Regex 개체는 Regex 생성자에 정규표현식을 매개변수로 전달하여 만들 수 있습니다. 개체를 생성했으면 Regex 개체의 IsMatch 메서드를 사용하여 검사를 수행할 수 있습니다. IsMatch 메서드는 검사할 문자열을 매개변수로 취합니다. IsMatch 메서드는 전달한 문자열이 정규표현식과 일치한다면 true를 반환하고 그렇지 않다면 false를 반환하게 됩니다. 코드는 다음과 같습니다.
{
Regex regex = new Regex(regexString);
return r.IsMatch(inputValue);
}
위 메서드의 실행 결과는 다음과 같습니다.
Validate(“^\d+$”, ”12345A”); //false 반환
다양한 문자열을 검사하기 위해 Regex 개체를 반복적으로 사용할 수 있습니다. 그러나 Regex 개체에 할당된 정규표현식은 생성자를 통해 할당하였고 별도의 속성을 제공하지 않기 때문에 교체할 수 없습니다. Regex 개체를 재사용할 수 없으므로 새로운 정규표현식을 사용하기 위해서는 매번 Regex 개체를 생성해야 합니다. 이는 그다지 훌륭한 방법이 아닐 수 있습니다. 이런 경우 보다 적절한 대안은 IsMatch 메서드의 오버로드로 제공되는 static 메서드를 사용하는 것입니다
{
return Regex.IsMatch(regexString, inputValue);
}
앞에서 설명한 두 방법은 Regex개체가 사용될 때 마다 런타임이 정규표현식을 중간 형식(Intermediate form, opcode)으로 변경(interpret)한 다음 대상 문자열에 적용합니다. 이로 인한 문제점 및 해결을 위한 방법을 다음 글에서 알아보도록 하겠습니다.
감사합니다.
(http://taeyo.net 참조문건)