Post List

2015년 8월 28일 금요일

C# Regular Expression (정규식) 사용법

1. Regular Expression 이 무엇이며 왜 써야 하나요 ?

Python 관련 Posting 에서 해당 내용에 대해서 적었습니다.

http://devluna.blogspot.kr/2015/08/python-15-regular-expressions.html

위 Link를 참조해주세요.

2. Regex Class

C#에서 Regular Expression을 지원해주는 class 입니다.
full namespace는 System.Text.RegularExpressions.Regex 입니다.

3. IsMatch( ) method

정규식 표현과 해당 문자열이 만족하는지를 검사합니다.

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string[] strs = { "12345""LunaStar" };
        string alphabetPattern = "[a-z]+";

        foreach (string s in strs)
            Console.Out.WriteLine("{0} is {2} matched in {1}"salphabetPattern,
                Regex.IsMatch(salphabetPattern? "" : "not");

        string[] partNumbers = { "1298-673-4192""A08Z-931-468A"
                            "_A90-123-129X""12345-KKA-1230""0919-2893-1256" };
        Regex rgx = new Regex(@"^[a-zA-Z0-9]\d{2}[a-zA-Z0-9](-\d{3}){2}[A-Za-z0-9]$");
        foreach (string partNumber in partNumbers)
            Console.WriteLine("{0} {1} a valid part number."partNumber,
                rgx.IsMatch(partNumber? "is" : "is not");
    }
}
12345 is not matched in [a-z]+
LunaStar is  matched in [a-z]+
1298-673-4192 is a valid part number.
A08Z-931-468A is a valid part number.
_A90-123-129X is not a valid part number.
12345-KKA-1230 is not a valid part number.
0919-2893-1256 is not a valid part number.

위에서 사용한 방법은 Regex Instance를 따로 생성하지 않고 static 으로 해당 함수를 사용했습니다. 이 경우 인자로 Regex Pattern을 같이 전달하였습니다.
아래에 사용한 방법은 Regex Instance를 생성하면서 Pattern을 생성자로 전달하였습니다.

4. Match( ) method & Match Class

IsMatch( )는 문자열 전체와 패턴이 맞는지를 검사하지만,
Match( )는 문자열 내에 패턴과 맞는 것이 있는지를 검사합니다.
그 결과 Match Instance가 return 되며 그 안에서 패턴과 맞는 문자열 및 원본 문자열 내에서의 위치정보를 알 수 있습니다.

using System;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main(string[] args)
    {
        string text = "One car , red car , clean Car , my car";
        string pattern = @"(\w+)\s+(car)";

        Regex R = new Regex(patternRegexOptions.IgnoreCase);
        Match M = R.Match(text);

        while (M.Success)
        {
            Console.Write("MATCH : ");
            foreach(Group G in M.Groups)
            {
                Console.Write(" {0} : "G);
                foreachCapture C in G.Captures)
                {
                    Console.Write("[{0} , {1}]"CC.Index);
                }
             }
            Console.WriteLine("");
            M = M.NextMatch();
        }
    }
}

MATCH :  One car : [One car , 0] One : [One , 0] car : [car , 4]
MATCH :  red car : [red car , 10] red : [red , 10] car : [car , 14]
MATCH :  clean Car : [clean Car , 20] clean : [clean , 20] Car : [Car , 26]
MATCH :  my car : [my car , 32] my : [my , 32] car : [car , 35]

위 결과를 보면 알겠지만, Match 내에 Group이 있습니다. Group의 첫번째는 Match 된 전체 문자열이며, 그 다음부터는 문자열 내에 Group을 나타냅니다.
Capture 에서 원본 문자열 내에서의 인덱스까지 확인이 가능합니다.

5. Replace( )

정규식 패턴을 찾아서 해당 문자열을 바꾸는 기능을 제공합니다.

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        string input = "This is   text with   far  too   much   whitespace.";
        string pattern = "\\s+";
        string replacement = " ";
        string result = Regex.Replace(inputpatternreplacement);

        Console.WriteLine("Original String: {0}"input);
        Console.WriteLine("Replacement String: {0}"result); 
    }
}

Original String: This is   text with   far  too   much   whitespace.
Replacement String: This is text with far too much whitespace.

위 예제를 보면 whitespace 패턴을 찾아서 space 1칸으로 바꿔줍니다.

댓글 없음:

댓글 쓰기