Rustで文字列から全角カタカナだけを取り出す(`matches!`マクロの実用例)


はじめに

Rust 1.42.0でstdに導入された、matches!というマクロがあります。
先日「Rustで文字列の中から全角カタカナだけを取り出して、新たな文字列を生成する」というコードを書く機会があり、このmatches!マクロを使用することで簡潔に記述することができました。

なのでmatches!マクロを使用した実用的なコード例として、ちょっとした小ネタ的に書き留めておきます。

なお、本コードの検証に使用した環境はrustc 1.43.1およびrustc 1.45.0-nightlyです。

matches!マクロとは

Rust 1.42.0以上で使用可能1なマクロであり、与えられたパターンにマッチするか否かを返します。

例えば

let hoge = 'a';
let fuga = matches!(hoge, 'a'|'b');
assert!(fuga); // true

のように使用します。

この時matches!(hoge, 'a'|'b')は下記のように展開されます。

match hoge{
    'a'|'b' => true,
    _ => false,
}

実際に全角カタカナを取り出してみる

fn main() {

    let txt = "Rust(ラスト)で文字列から全角カタカナだけを取り出す"
        .chars()
        .filter(|&c| matches!(c, 'ァ' ..= 'ー'))
        .collect::<String>();

    assert_eq!(txt,"カタカナ");
}

これだけ2

簡単に解説すると、

  1. 文字列リテラル&strcharscharのイテレータに変換する
  2. filterで条件にマッチする要素のみを取り出す
  3. この際にmatches!を使用し、の範囲に含まれるかを条件として指定する
  4. 取り出された要素をcollectで結合してStringにする

といった感じの操作を行っています。


  1. それ以前のバージョンでも、こちらのクレートを使用することでmatches!マクロが使用可能となると思われます(未検証)。 

  2. 本コードではの全角カタカナに加えておよびの記号も一緒に取り出したかったため、取り出す範囲として'ァ' ..= 'ー'を指定しています。