정규표현은 텍스트에서 매칭되는 문자의 패턴을 찾아내기 위해 사용하는 강력한 툴로, Perl, Ruby, Javascript 등의 언어에 포함되어 있다. C언어의 경우에도 라이브러리 형태로 이용할 수 있다. 이중 Perl과 Ruby는 정규표현을 매우 능숙하게 다루도록 만들어져 있다. D언어는 런타임 라이브러리(:12) 형태로 정규표현(:12)을 지원한다. 여기에서는 펄과 비교해가면서, D언어에서의 정규표현에 대해서 알아보도록 할 것이다.
역자주 : 원문은 Ruby와 비교해서 설명하고 있지만, 개인적으로 Perl에 더 익숙한 관계로 Perl로 대체했습니다.
장규표현에 대한 자세한 내용은 정규표현문서들을 참고하기 바란다.
패턴매칭
perl은 정규표현과 관련된 전용의 문법을 제공한다. 패턴매칭은 다음과 같은 방법으로 이루어진다.
C나 C++로 이런코드를 만들어야 한다고 생각해보라. 벌써부터 골치가 아파올 것이다. 그러나 D에서는 간단하게 해치울 수 있다.
auto s = std.regexp.search("abcdefg","c");
if (s)
{
writefln("%s[%s]%s", s.pre, s.match(0), s.post);
}
다음과 같이 더 간단하게 만들 수도 있다.
if (auto s = std.regexp.search("abcdefg","c"))
{
writefln("%s[%s]%s", s.pre, s.match(0), s.post);
}
치환
치환은 더 유용하고 재미있는 기능이다. 다음은 문장중에 등장하는 모든 "a"를 "ZZ"로 변경하는 Perl 코드다.
#!/usr/bin/perl
$s = "Strap a rocket engine on a chicken.\n";
$s =~ s/a/ZZ/g;
print $s;
이걸 D로 바꾸어 보았다.
char[] s = "Strap a rocket engine on a chicken.";
char[] b = new char[80];
b = sub(s, "a", "ZZ"); // 처음 매칭되는 문자열만 치환
writefln(b);
b = sub(s, "a", "ZZ", "g"); // 모든 매칭되는 문자열을 치환
writefln(b);
다음과 같이 매치된 문자열의 레퍼런스를 이용한 치환도 가능하다.
b = sub(s, "[ar]", "[$&]", "g");
// result: St[r][a]p [a] [r]ocket engine on [a] chicken.
매칭된 문자열을 대문자로 치환할 수도 있다.
b = sub(s, "[ar]",
(RegExp m) {return toupper( m.match(0));}, "g");
정규표현
패턴매칭
치환
루프
참고문헌
Recent Posts
Archive Posts
Tags