4. 정규식(regular expressions) 사용
정규식은 특정값의 형식, 예를 들어 사용자가 입력한 값이 원하는 형식과 일치하는지를 확인할 수 있는 강력한 수단이며 대부분이 프로그래밍 언어에서 정규식을 기본적으로 지원하고 있습니다.
using System;
using System.Text.RegularExpressions;
namespace myapp
{
class Program
{
static void Main(string[] args)
{
Console.Write("귀하의 나이를 입력하십시오. : "); string? input = Console.ReadLine();
Regex regx = new(@"\d");
if (regx.IsMatch(input ?? string.Empty))
Console.WriteLine($"귀하의 나이는 {input}입니다.");
else
Console.WriteLine("입력 형식이 잘못되었습니다.");
//귀하의 나이를 입력하십시오. : 열살
//입력 형식이 잘못되었습니다.
//귀하의 나이를 입력하십시오. : 10
//귀하의 나이는 10입니다.
}
}
}
예제에서는 정규식을 통해 사용자가 입력한 값이 숫자인지를 판별하고 그에 따라 다른 메시지를 내도록 되어 있습니다.
예제에서 정규식은 아래와 같이 구현되었는데
Regex ageChecker = new(@"\d");
정규식 구성 문자열인 '@\d'를 사용해 Regex 정규식 객체의 인스턴스를 생성하고 생성된 인스턴스의 IsMatch() 메서드를 통해 정규식의 규칙과 입력값이 부합하는지를 판단하고 있습니다.
정규식 문자열에서 @는 백 슬래시(\)와 같은 문자로 인해 뒤의 문자를 '확장 문자열'로 인식되지 않도록 하기 위한 조치입니다. 예를 들어 확장 문자열에서 \t에서 t는 Tab을 의미하며 \n에서 n은 New Line을 의미하지만 정규식에서는 다른 뜻으로 해석되어야 합니다. 참고로 예제에서의 \d에서 d는 하나의 숫자를 의미합니다.
정규식 \d는 입력 내용 중 숫자가 하나라도 있으면 정규식의 조건과 부합하는 것으로 인식할 것입니다. 이는 입력된 값의 처음과 끝에 어떤 문자가 올지를 명시하지 않았기 때문인데 예를 들어 '내 나이는 1살이야.'라고 입력해도 어찌 되었건 하나의 숫자를 포함하고 있기 때문에 정상적으로 입력된 것으로 판단하는 것입니다.
따라서 정확한 숫자 값을 받기 위해 아래와 같이 정규식을 수정합니다.
Regex regx = new(@"^\d$");
^는 처음을, $는 끝을 의미합니다. 따라서 위 정규식은 '처음과 끝을 통틀어 단 하나의 숫자만 올 수 있다.'로 해석할 수 있습니다. 이것으로 정확히 숫자만을 입력해야 한다는 것이 명시되었지만 여전히 존재하는 문제는 단 하나의 숫자만 올 수 있다는 것이며 때문에 한 자릿수의 나이만 입력이 가능하다는 것입니다.
이를 해결하기 위해 +문자를 d뒤에 붙여줍니다. +는 '계속될 수 있다.'는 의미를 갖고 있으므로 d+는 '1개의 숫자가 계속될 수 있다'로 바뀔 수 있습니다.
Regex regx = new(@"^\d+$");
이로서 '입력값 전후 모두 숫자로만 되어 있어야 하며 그 숫자는 1개 이상 올 수 있다.'라는 정규식이 완성되었습니다.
아래의 표는 위와 같이 다양한 환경에서 사용 가능하며 정규식에서 흔하게 사용할 수 있는 몇 가지 기호를 나열한 것입니다.
^ | 시작 | $ | 끝 |
\d | 한개의 숫자 | \D | 숫자가 아닌 한개의 문자 |
\s | 공백 | \S | 비공백 |
\w | 알파벳, 숫자 | \W | 비알파벳, 비숫자 |
[A-Za-z0-9] | 알파벳과 숫자의 범위 | \^ | ^ 문자 |
[abc] | 가능한 문자의 모음 | [^abc] | 가능하지 않은 문자의 모음 |
. | 단 하나의 모든 문자 | \. | . 문자 |
+ | 하나 또는 그 이상 | ? | 하나 또는 없음 |
{3} | 정학히 3개 | {3,5} | 3~5개 |
{3,} | 최소 3개 | {,3} | 3개 이상 |
위 표를 근거로 정규식을 표현하기 위한 몇가지 예를 다음과 같이 들 수 있습니다.
- \d : 입력값 중 단 하나이상의 숫자가 존재할 것
- a : 입력값 중 단 하나이상의 a문자가 존재할 것
- cliel : 입력값 중 cliel문자열이 존재할 것
- ^cliel : 반드시 cliel로 시작할 것
- cliel$ : 반드시 cliel로 끝날 것
- ^\d{2}$ : 정확히 2개의 숫자만 올 것
- ^[0-9]{2}$ : 정확히 2개의 숫자만 올것(\d대신 [0-9]로 입력 가능한 값을 제한고 있음)
- ^[A-Z]{4,}$ : 최소 4개의 대문자
- ^[A-Za-z]{4,}$ : 대소문자 포함 최소 4개의 문자
- ^[A-Z]{2}\d{3}$ : 대문자 2개와 숫자 3개
- ^c.liel$ : c와 liel사이에 1개의 문자 (^c\.liel$ 라면 반드시 c.liel이 되어야 함)
'.NET' 카테고리의 다른 글
[.NET] 닷넷 Type 사용하기 - 5. index와 range 그리고 Span (0) | 2022.06.26 |
---|---|
[.NET] 닷넷 Type 사용하기 - 4. Collection 사용 (0) | 2022.06.26 |
[.NET] 닷넷 Type 사용하기 - 2. 날짜와 시간 (0) | 2022.06.26 |
[.NET] 닷넷 Type 사용하기 - 1. 숫자, 문자열 (0) | 2022.06.26 |
[.NET] 닷넷 - 5. .NET Framework에서 .NET으로의 전환 (0) | 2022.06.24 |