정규 표현식(Regular Expression)

blimeyoops·2023년 9월 14일
0

c#

목록 보기
4/6
post-custom-banner

정규식 구성

정규식 구성 코드 슬래쉬 문자 두개 사이로 정규식 기호가 들어가는 형태이고 뒤에 정규식 플래그를 작성한다.

정규식 플래그(flag)

flag의미설명
iIgnore Case대소문자를 구별하지 않고 검색한다.
gGlobal문자열 내의 모든 패턴의 정규식을 검색한다.
mMulti Line문자열의 행이 바뀌어도 정규식을 검색한다.
s정규식 검색 시 \n도 포함해 정규식을 검색한다.
uunicode정규식 검색 시 유니코드를 지원한다.
ysticky문자 내 특정 위치에서 검색을 진행하는 ‘sticky’ 모드를 활성화한다.

정규식 패턴

문자 숫자 패턴

패턴의미
a-zA-Z-로 범위를 지정하고 소문자 a부터 z, 대문자 A부터 Z까지의 패턴을 의미
ㄱ-ㅎ가-힣-로 범위를 지정하고 한글 패턴을 의미
0-9-로 범위를 지정하고 숫자 패턴을 의미
.모든 문자열 패턴(숫자, 한글, 영어, 특수기호, 공백 모두)
\d숫자 패턴
\D숫자가 아닌 패턴
\w밑줄을 포함한 영어,숫자 문자 패턴
\W\w가 아닌 패턴
\s공백 패턴
\S공백이 아닌 패턴
\특수기호특수기호 패턴

검색 패턴

패턴의미
|OR
[ ]대괄호 안에 지정된 문자, 숫자로 OR로 문자를 검색
ex, [abc]이면 a또는 b또는 c
[^문자]대괄호 안에 지정된 문자를 제외
^문자열특정 문자열로 시작
문자열$특정 문자열로 끝남

갯수 반복 패턴

패턴의미
*지정한 문자별로 없거나 있는 패턴을 의미
ex, ab* 정규식은 a 또는 b가 있는 패턴을 찾는다.
+지정한 문자가 최소 한개 또는 여러개 있는 패턴을 의미
ex, ab+ 정규식은 ab가 있는 패턴을 찾는다.
??앞에 입력된 문자가 없거나 최대 하나인 반복 패턴을 의미
++앞에 입력된 문자가 하나에서 여러개인 반복 패턴을 의미
**앞에 입력된 문자가 있거나 없는 반복 패턴을 의미
{n}n개 반복 패턴
{n,}최소 n개 이상 반복 패턴
{n,m}최소 n개 이상, 최대 m개 이하 반복 패턴

c# 정규식 사용법

c#에서 정규식을 사용해 지정한 패턴과 일치하는 문자 추출 및 일치 여부를 확인하기 위해서는 System.Text.RegularExpressions Namespace를 사용한다.

Regex 클래스 객체를 선언할때 Regex 생성자의 1개 또는 2개의 parameter를 전달하는데 정규식 패턴과 정규식 옵션을 전달한다.

  • 정규식 패턴
    parameter로 전달하는 정규식 패턴은 정규식 구성에서 패턴 부분만 전달하면 되고 시작, 종료 기호는 작성하지 않는다.

  • 정규식 옵션
    정규식 옵션은 정규식 구성에서 정규식 flag에 해당하는 부분으로 글로벌 옵션을 제외하고는 RegexOptions enum 타입으로 설정이 가능하다.

정규식 예시-1

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "I like apple. Apple is very sweet.";
        
        Regex regex = new Regex(@"apple", RegexOptions.IgnoreCase);
        
        var m = regex.Match(str);
        Console.WriteLine($"Regex match - {m}");

        var mcs = regex.Matches(str);
        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex matches - {mc}");
        }

        Console.ReadLine();        
    }
}

// output
// Regex match - apple
// Regex matches - apple
// Regex matches - Apple

변수 str에 정규식 패턴과 일치하는 문자열을 찾기 위해 Match와 Matches 메서드를 사용한다. Match 메서드는 정규식으로 찾은 단일 일치 항목의 결과를 Matches는 정규식으로 찾은 다중 일치 항목의 결과를 반환하는데 Matches는 정규식 플래그의 Global에 해당한다.

정규식 예시-2

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "Apple is very sweet.\nBanana is terrible.";
        
        var m = Regex.Match(str, @"^apple", RegexOptions.IgnoreCase);
        Console.WriteLine($"Regex match - {m}");

        m = Regex.Match(str, @"^banana", RegexOptions.IgnoreCase);
        Console.WriteLine($"Regex match - {m}");

        m = Regex.Match(str, @"^banana", RegexOptions.Multiline);
        Console.WriteLine($"Regex match - {m}");

        m = Regex.Match(str, @"^banana", RegexOptions.IgnoreCase | RegexOptions.Multiline);
        Console.WriteLine($"Regex match - {m}");

        Console.ReadLine();        
    }
}

// output
// Regex match - Apple
// Regex match -
// Regex match -
// Regex match - Banana

위 코드는 문자열의 행이 바뀌어도 정규식을 검색하는 코드로 RegexOptions에 Multiline과 IgnoreCase를 설정해 banana로 검색되게 패턴을 지정한다. 만약 여러개의 banana의 패턴과 일치하는 결과를 찾고 싶으면 Matches 메서드를 사용하면 된다.

정규식 예시-3

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "Monday Tuesday Wendesday Thursday";
        
        var mcs = Regex.Matches(str, @"(mon|tues|wendes)day", RegexOptions.IgnoreCase);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex matches - {mc}");
        }

        Console.ReadLine();        
    }
}

// output
// Monday
// Tuesday
// Wendesday

( ) 안에 들어간 문자를 선택 |(파이프라인)을 이용해 나눠 일치하는 패턴을 검색한다.

정규식 예시-4

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "Monday Tuesday Wendesday Thursday MonMonday";
        
        var mcs = Regex.Matches(str, @"(mon)*day", RegexOptions.Multiline);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex * matches - {mc}");
        }

        mcs = Regex.Matches(str, @"(mon)+day", RegexOptions.Multiline);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex + matches - {mc}");
        }

        mcs = Regex.Matches(str, @"(mon)?day", RegexOptions.Multiline);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex ? matches - {mc}");
        }

        Console.ReadLine();        
    }
}

// output
// Regex * matches - Monday
// Regex * matches - day
// Regex * matches - day
// Regex * matches - day
// Regex * matches - MonMonday
// Regex + matches - Monday
// Regex + matches - MonMonday
// Regex ? matches - Monday
// Regex ? matches - day
// Regex ? matches - day
// Regex ? matches - day
// Regex ? matches - Monday

첫번째 정규식 "(mon)*day"은 * 앞에 입력된 문자가 있든 없든 상관없이 매칭하고 두번째 정규식 "(mon)+day"는 + 앞에 입력된 문자가 하나거나 또는 여러개거나 상관없이 매칭한다. 세번째 정규식 "(mon)?day"는 앞에 입력된 문자가 없거나 최대 하나인 경우만 매칭한다.

정규식 예시-5

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "Apple is very sweet.(Banana is terrible.)";
        
        var mcs = Regex.Matches(str, @"\(.+\)", RegexOptions.IgnoreCase);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex ( ) matches - {mc}");
        }

        Console.ReadLine();        
    }
}

// output
// Regex ( ) matches - (Banana is terrible.)

( )안의 모든 텍스트를 찾기 위해 특수문자를 나타내는 ( 와 )를 양끝쪽에 넣고 ( )사이는 모든 문자를 찾되 최소 한개 또는 여러개를 매칭하는 + 반복 패턴을 넣는다.

정규식 예시-6

internal class Program
{
    public static void Main(string[] args)
    {
        string str = "Apple is very sweet.(Banana is terrible.)\n포도는 보통이다.";
        
        var mcs = Regex.Matches(str, @"[가-핳]{2}", RegexOptions.IgnoreCase);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex {{2}} matches - {mc}");
        }

        mcs = Regex.Matches(str, @"[가-핳]{2,}", RegexOptions.IgnoreCase);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex {{2,}} matches - {mc}");
        }

        mcs = Regex.Matches(str, @"[가-핳]{2,3}", RegexOptions.IgnoreCase);

        foreach (var mc in mcs)
        {
            Console.WriteLine($"Regex {{2,3}} matches - {mc}");
        }

        Console.ReadLine();        
    }
}

// output
// Regex {2} matches - 포도
// Regex {2} matches - 보통
// Regex {2} matches - 이다
// Regex {2,} matches - 포도는
// Regex {2,} matches - 보통이다
// Regex {2,3} matches - 포도는
// Regex {2,3} matches - 보통이

첫번째 정규식 패턴은 한글을 찾기위한 [가-핳] 정규식 패턴과 숫자 반복 {2} 패턴을 이용해 매칭되는 문자를 찾는다. 두번째 정규식은 {2,} 반복 패턴으로 최소 문자가 2개 이상인 매칭되는 문자를 찾고 세번재 정규식은 2이상 3이하인 문자 반복 패턴은 찾는다.

post-custom-banner

0개의 댓글