Header

  1. View current page

    꿈꾸는자의 생각의 파편과 나열...

Profile_image?t=1222470982&type=small
꿈꾸는자가 생각하는 생각의 파편들과... 그가 꿈꾸는 새상들... 그리고, 끄적 끄적~
2

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해서 사용할 수 있다.

루프

문자열에 대해서 루프를 돌면서 모든 매칭되는 것들을 찾는 것도 가능하다.
import std.stdio;
import std.regexp;

void main()
{
    foreach(m; RegExp("ab").search("abcabcabab"))
    {
        writefln("%s[%s]%s", m.pre, m.match(0), m.post);
    }
} 
// 출력결과 :  
// [ab]cabcabab
// abc[ab]cabab
// abcabc[ab]ab
// abcabcab[ab]

History

Last edited on 06/13/2007 10:03 by 꿈꾸는자

Comments (0)

You must log in to leave a comment. Please sign in.