Ccmmutty logo
Commutty IT
0 pv4 min read

第16話 V言語の正規表現(v 0.3対応)

https://cdn.magicode.io/media/notebox/blob_JjTSxBu
カサレリア。katzenです。
前回から間が空いてしまいましたが、予告通り正規表現について書きたいと思います。
みなさん正規表現使ってますか? 正規表現といえば、POSIXPCRE(Perl互換)が浮かんでくるかと思います。
さて、V言語はといいますと、
最初に regex is not PCRE compatible.って書いてありますね。 かといって POSIXでもないです。
パフォーマンスなどの関係で結果的にこうなっているそうです。
記述方法さえ覚えてしまえば、普通に使う分にはそこまで困らないと思います。
これは説明するよりもサンプルを見てもらったほうが早いと思います。
import regex

fn main(){
 regex_test(
   r'(?P<hoge>i[co]?)',
   "https://jp.magicode.io/k.suzuki")
}

fn regex_test(
        pattern string,
        text string
) {
        mut re := regex.regex_opt(pattern) or { panic(err) }
        println("Original:${text}")

        print("find:")
        println(re.find(text))  // (14,16) 最初のhit位置

        print("find_all:")
        println(re.find_all(text))      // [14,16,...] hit位置

        print("find_all_str:")
        println(re.find_all_str(text))  // ['ic','io','i'] hit文字

        print("find_from:")
        println(re.find_from(text,15))  // (20,22) どこから探すか(byte)

        print("get_group_bounds_by_id:")
        println(re.get_group_bounds_by_id(0))   // (20,22) 見つかったグループの番号 find系に依存

        print("get_group_bounds_by_name:")
        println(re.get_group_bounds_by_name("hoge")) // (20,22) 見つかったグループの名前 find系に依存

        print("get_group_by_id:")
        println(re.get_group_by_id(text,0))

        print("get_group_by_name:")
        println(re.get_group_by_name(text,"hoge"))

        print("get_group_list:")
        println(re.get_group_list())

        print("match_string:")
        println(re.match_string(text))

        print("matches_string:")
        println(re.matches_string(text)) // false

        print("replace:")
        println(re.replace(text,r'<\0>')) // https://jp.mag<ic>ode.<io>/k.suzuk<i> 置換

        // print("replace_by_fn:")
        // println(re.replace_by_fn(text,{'A'}))

        print("replace_n:")
        println(re.replace_n(text,r'<\0>',1)) // https://jp.mag<ic>ode.<io>/k.suzuk<i> 置換 limit

        print("replace_simple:")
        println(re.replace_simple(text,r'<\0>')) // https://jp.mag<\0>ode.<\0>/k.suzuk<\0> 置換 hitは使えない
}
と、こんな感じです。
PHPとかヒットした内容の連想配列とかで作ってくれますが、こちらはヒットしたポジションを返してくれます。
find_all_str とかを使えば近い動作になるかと思います。
特に日本語(マルチバイト文字)でも動作に問題はありませんでした。
説明するよりも、公式のサンプルを見てもらったり、実際にためしてみたほうがいいと思います。
次回はまだ決めてませんが、決まったら更新しておきますね。 リクエストとかあればコメントもらえると嬉しいです。

Discussion

コメントにはログインが必要です。