Writter by Youngil Kim, C#.NET Developer
특정 문자열에서 특정 패턴에 맞는 부분문자열을 뽑아내는 방법에 대해서 정규식을 이용하는 방법을 정리해보겠습니다. (사실 저도 가끔써먹을때가 있는데 정리해두면 좋을것같아성)
예로 HTML에서 가장많이 사용하는 형태로,
<a href="URL" ~>링크</a>
와 같은 앵커요소에 대해서 URL과 텍스트부분을 얻고자 한다면 다음과 같이 정규식으로 표현할 수 있습니다.
<a href="(?<url>.*?)".*?>(?<text>.*?)</a>
( 와 )로 둘러쌓인 부분은 그룹화를 하고 있어 각각 ?<url>, ?<text>에 의하여 url과 text라고 그룹명을 붙여 있고 .*?라는 부분은 최단일치를 지정하는 것으로 .*?>는 >이외의 임의의 문자를 나란히 + > ,를 나타내는 형태입니다.
- Regex 객체 만들기
먼저, 정규식을 사용하게 해주는 System.Text.RegularExpressions네임스페이스의 Regex클래스의 객체를 만듭니다.
Regex rg = new Regex("<a href=\"(?<url>.*?)\".*?>(?<text>.*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
위에서 2개의 파라미터로 2개의 옵션을 지정하는데 RegexOptions.IgnoreCase는 대소문자 구별없이 매치시키는 것으로 이것에 의해 <A HREF=.....>일 것이라는 앵커요소에도 매치됩니다. RegexOptions.Singleline는 임의의 1문자를 나타내며 . 을 개행문자에도 매치시키기 위한 것으로 1개의 앵커요소가 여러행에 걸쳐서 있어도 매치하게 됩니다.
- Match 객체 얻기
다음으로 매칭을 실행하고 처음에 매치된 부분을 System.Text.RegularExpressions네임스페이스의 Match클래스의 객체로서 얻습니다. 이것에는 Regex객체의 Match메소드를 호출합니다. Match메소드의 파라미터에는 검색대상으로 된 텍스트를 문자열로 지정합니다. 이 예제에서는 HTML의 내용이라고 보시면 될것같네요.
Match m = reg.Match(<검색대상으로 된 문자열>);
단, 매치된 부분이 검색대생에 존재하지 않으면 Match객체의 Success속성이 false로 됩니다. 2번째 매치된 부분은 이와 같이 얻어진 Match객체에 대해 NextMatch메소드를 호출하여 얻습니다.
m = m.NextMatch();
이 경우에도 Success속성에 의해 매치한 부분이 존재하는지 확인할 필요가 있습니다. 이후 줄줄이 NextMatch 메소드를 호출하면서 모든 매치된 부분을 순서대로 얻을 수 있습니다.
- Match 객체로부터 그룹화한 부분 얻기
Match객체는 정규식에 매치한 부분 문자열전체를 가지고 있지만, 정규식에 그룹화를 한 경우, 그 문자열로부터 그룹화한 부분만 얻을 수 있습니다. 이것에는 다음과 같이 Match객체의 Groups속성으로 그룹명을 지정하여 해당 Value속성에 접근할 수 있습니다.
string url = m.Groups["url"].Value;
string text = m.Groups["text"].Value;
정규식내 그룹에 이름을 붙여 있지 않는 경우, 자동적으로 거절당한 번호에 의해 Groups속성에 접근한 것이 되지만, 이름을 붙인 쪽이 코드를 읽기 쉽게 됩니다.
[예제]
이 예제는 네이버의 메인페이지를 읽고 해당 HTML로부터 앵커요소에 포함된 URL부분과 링크문자열부분을 분리하여 보여줍니다.
using System;
using System.Net;
using System.Text.RegularExpressions;
class RegexMatch {
static void Main() {
string anchor = "<a href=\"(?<url>.*?)\".*?>(?<text>.*?)</a>";
WebClient wc = new WebClient();
string html = wc.DownloadString("http://www.naver.com/");
Regex re = new Regex(anchor, RegexOptions.IgnoreCase | RegexOptions.Singleline);
for(Match m = re.Match(html); m.Success; m=m.NextMatch()) {
string url = m.Groups["url"].Value;
string text = m.Groups["text"].Value;
Console.WriteLine(url);
Console.WriteLine(text);
}
}
}
[출처] [C#]정규식을 사용하여 부분 문자열얻는 방법|작성자 지킬박사
'개발 > C#' 카테고리의 다른 글
C# 압축파일에서 압축풀지 않고 이미지 가져오기 (0) | 2019.04.29 |
---|---|
C# [미디어] 코덱 (0) | 2019.04.23 |
C# 대용량 파일에서 마지막 라인 읽기 (0) | 2019.04.10 |
C# [시스템] delay 함수 (0) | 2019.03.23 |
C# Html to pdf 변환 (0) | 2018.11.20 |
C# 웹브라우저 메모리 누수 (0) | 2018.06.08 |
C# 델리게이트 (0) | 2018.05.24 |
[그래프] C# 속도계 (Gage) (0) | 2018.04.25 |