마이 플밍 블로그

Regular Expression 본문

Code/C#

Regular Expression

레옹 2021. 9. 27. 23:01

복잡한 문자열 처리를 위해서는 Regular Expression를 사용한다.

닷넷에선 이 기능을 Regex 클래스를 중심으로 구현을 했다.

 

Regular Expression의 기능은 Perl에서 진화한 것인데 Perl 5 Regular Expression와 호환 되도록 하였다

Regular Expression을 이용하면 문자열 데이터에서 특정 패턴을 찾아내고 다른 문자열 데이터로 치환할 수 있다.

 

Regex 문자열 패턴 찾기

Regex 클래스를 활용해 특정 문자 패턴을 찾는 몇가지 예를 보자

Regex를 생성할 때 특정 문자패턴을  파라미터로 넘긴다 Match()메서드를 이용해서 문자열에 문자 패턴이

존재하는지 검사한다.

Regex.Match는 Match 클래스 객체를 리턴한다.

존재한다면 Match.Success가 True로 되고 Match.Index를 통해 문자 패턴의 위치를 알 수있다.

 

EX1 문자열에서 특정 문자 패턴을 찾는 예제로 맨처음 하나의 패턴만 찾는다

EX2 문자열에서 특정 문자 패턴이 여러개 있을 경우 NextMatch 매서드를 이용해서 특정 문자 패턴을 여러개 찾을 수 있다.

EX3 MatchCollection클래스를 이용한 것으로 모든 매칭 문자들을 MatchCollection 객체로 리턴한다

 

        // Ex1. 첫 매치 문자열 출력
        string str = "서울시 강남구 역삼동 강남아파트";
        Regex regex = new Regex("강남");
        Match m = regex.Match(str);
        if (m.Success) {
            Debug.Log(string.Format("{0}:{1}", m.Index, m.Value));
        }

        // Ex2. 매치된 문자열 계속 출력
        Regex regex1 = new Regex("강남");
        Match m1 = regex1.Match(str);
        while (m.Success) {
            Debug.Log(string.Format("{0}:{1}", m1.Index, m1.Value));
            m1 = m1.NextMatch();
        }

        //// Ex3. Matches() 메서드
        Regex regex2 = new Regex("강남");
        MatchCollection mc = regex2.Matches(str);
        foreach (Match m3 in mc) {
            Debug.Log(string.Format("{0}:{1}", m3.Index, m3.Value));
        }

 

Split

일반적인 string.split처럼 문자열을 분리시켜준다

string str = "서울시 강남구 역삼동 강남아파트";

Regex regex = new Regex(" ");
string[] vals = regex.Split(str);
foreach (string s in vals)
{
    Debug.WriteLine(s);
}

Named Group

?<그룹이름> 이용해서 그룹을 지정할 수 있다.

Match.Groups[그룹이름]을 이용해서 그룹을 가져올 수 있다

            // Ex1. named group (?<name> )
            string str = "02-632-5432; 032-645-7361";
            Regex regex = new Regex(@"(?<areaNo>\d+)-(?<phoneNo>\d+-\d+)");
            MatchCollection mc = regex.Matches(str);
            foreach (Match m in mc) {
                string area = m.Groups["areaNo"].Value;
                string phone = m.Groups["phoneNo"].Value;
                Console.WriteLine("({0}) {1}", area, phone);
            }

            // Ex2
            string str1= "<div><a href='www.sqlmgmt.com'>SQL Tools</a></div>";
            string patt = @"<a[^>]*href\s*=\s*[""']?(?<href>[^""'>]+)[""']?";
            Match m2 = Regex.Match(str1, patt);
            Group g = m2.Groups["href"];
            Console.WriteLine(g.Value);

 

패턴 내용을 그룹명으로 지정하면 ${그룹 명}로 치환 표현식에서 사용할 수 있다.

문자열 치환

            // Ex1. 앞 공백 제거
            string str = "   서울시 강남구 역삼동 강남아파트 1  ";
            string patten = @"^\s+";
            // 앞뒤 공백 모두 제거시:  @"^\s+|\s+$";

            Regex regex = new Regex(patten);
            string s = regex.Replace(str, "");
            Console.WriteLine(s);

            // Ex2
            string str1 = "02-632-5432; 032-645-7361";
            string patten1 = @"(?<areaNo>\d+)-(?<phoneNo>\d+-\d+)";
            Regex regex1 = new Regex(patten1);
            string s1 = regex1.Replace(str1, @"(${areaNo}) ${phoneNo}");
            Console.WriteLine(s1);

 

https://www.csharpstudy.com/Practical/Prac-regex-2.aspx

'Code > C#' 카테고리의 다른 글

[C#] GC(Garbage Collector)의 작동원리  (0) 2022.04.03
C# 확장메서드 (Extension Method)  (0) 2021.09.28