D
정규표현
정규표현은 텍스트에서 매칭되는 문자의 패턴을 찾아내기 위해 사용하는 강력한 툴로, Perl, Ruby, Javascript 등의 언어에 포함되어 있다. C언어의 경우에도 라이브러리 형태로 이용할 수 있다. 이중 Perl과 Ruby는 정규표현을 매우 능숙하게 다루도록 만들어져 있다. D언어는 런타임 라이브러리 형태로 정규표현을 지원한다. 여기에서는 펄과 비교해가면서, D언어에서의 정규표현에 대해서 알아보도록 할 것이다.
역자주 : 원문은 Ruby와 비교해서 설명하고 있지만, 개인적으로 Perl에 더 익숙한 관계로 Perl로 대체했습니다.
장규표현에 대한 자세한 내용은 정규표현문서들을 참고하기 바란다.패턴매칭
perl은 정규표현과 관련된 전용의 문법을 제공한다. 패턴매칭은 다음과 같은 방법으로 이루어진다.
$string = "hello yundream"; $string =~ m/yundream/;매칭이 이루어지편 참이 리턴된다.
$string = "hello world";
if($string =~ m/yundream/)
{
print "OK\n";
}
D는 perl에서와 같은 전용의 문법을 가지고 있지는 않고, 함수차원에서 지원한다.
auto s = "hello yundream"; std.regexp.find(s, "yundream"); // 처음 일치된 위치인 6이 리턴된다. std.regexp.find(s, "world"); // 일치된 패턴이 없을경우 -1이 리턴된다.
Perl에서는 ()를 사용해서 각각의 매칭된값을 변수명으로 얻어올 수 있다.
$line = "abcdefg"; $line =~ m/(.*)(cd)(.*)/; print "$1\n"; print "$2\n"; print "$3\n";
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");
toupper 은 std.string를 import해서 사용할 수 있다.History
Last edited on 06/13/2007 10:03 by 꿈꾸는자
Comments (0)