2009年11月14日土曜日

GoogleのGoで正規表現(regexpパッケージ)

昨日インストールしたGoで遊んでみる。とりあえず、みんな大好き正規表現を使ってみつつ、雰囲気を掴もうと試みる。

package main
import( "regexp"; "fmt"; "flag";"os")

// command regexp target-str
func main()
{
flag.Parse();
if flag.NArg() < 2{
fmt.Printf("Require 2 args(now %d): regexp, target\n",flag.NArg());
}else{
var regstr string = flag.Arg(0);
var target string = flag.Arg(1);
re,err := regexp.Compile(regstr);
if err != nil
{
fmt.Printf("error@regexp.Comile:");
fmt.Print(err);
os.Exit(0);
}
strs := re.MatchStrings(target);
if l:=len(strs); l!=0
{
//substring
fmt.Printf("Match:%s\n",strs[0]);
for i:=1; i<len(strs); i++{
fmt.Printf("Match[%d]:%s\n",i,strs[i]);
}
}
else
{
fmt.Printf("No Match\n");
}
}
return;
}

mainパッケージのmain関数がエントリポイントのようだ。

importやconst(定数宣言)など、はかっことこっかで囲むことで複数同時に宣言できる。セミコロンはあってもなくても良いらしい。

変数の宣言時には、変数名の後に型(クラス?)の名前を書く。省略も可能。

//宣言
var hoge string;
//宣言+初期化
var hoge string = "hoge"
var hoge = "hoge"
hoge := "hoge"

また、Goは多値を扱える。2つ目の返り値でエラーかどうかを判定する何かを返すことが多そうだ。

flagパッケージはコマンドライン引数を処理、fmtパッケージはフォーマット入出力、以下略。パッケージについてはgolang.orgのPackage documentationにまとめられている。

ドキュメントの関数の見方は、例えば、fmtパッケージ内で

func Printf(format string, v ...) (n int, errno os.Error)
となっていれば、関数Printfは1つ目の引数に文字列,その後に可変長で引数を取り、整数とエラーを多値で返す,ということだろう。

以下、コンパイルして実行した結果

$./8.out "hoge" "fuga"
No Match
$./8.out "hoge" "hogefugapiyo"
Match:hoge
$./8.out "(ab|cd)efg" "abefghi"
Match:abeft
Match[1]:ab

もうすこしまともにチュートリアルを読んでから書くべきか・・・

0 件のコメント:

コメントを投稿