みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

Rustで文字列中のダブルクォーテーションと中括弧のエスケープ処理

備忘メモ。
忘れてまたググりそうなので。

Rustで、文字列*1中にダブルクォーテーション")と中括弧*2{})を含めたい場合、エスケープ処理が必要になる。

結論だけ先に書いとく。

  • ダブルクォーテーションの場合、エスケープ文字(\)を使って「\"」のように書く
  • 中括弧の場合、同じ文字列を繰り返し(「{」なら「{{」、「}」なら「}}」)と書く


参考情報:

Rustのエスケープ文字の一覧

doc.rust-lang.org

Module std::fmtのEscaping

doc.rust-lang.org



実行例:

なお、動作確認には、「Rustツアー」の「Rust Playground」を利用した。

tourofrust.com


まずは、「Hello world!」のコード。

fn main() {
    println!("Hello, World!");
}

これは、こうなる。

f:id:mzryuka:20220320225430p:plain

次に、この「Hello World!」のコードをprintlnするコードを書く。
そのまま、文字列の中に突っ込むと...

fn main() {
    println!("
      fn main() {
        println!("Hello, World!");
      }
    ")
}

まぁ、怒られる。

f:id:mzryuka:20220320223133p:plain

文字列中に「"」が含まれているから怒られているのは想像できるので、エスケープする。

fn main() {
    println!("
      fn main() {
        println!(\"Hello, World!\");
      }
    ")
}

これでOK...と思いきや、まだ怒られる。

無効な書式と言われてる。
「}」が来るべきところに、なんで「p」がきてるの?っって言われている。

中括弧が悪さをしてそう。
{}」は書式文字列(format!)で定義されているマクロなので、これが動作しないようにする必要がありそう。

f:id:mzryuka:20220320223204p:plain

ということで、エスケープをするも...

fn main() {
    println!("
      fn main() \{
        println!(\"Hello, World!\");
      \}
    ")
}

error: unknown character escape: `{`」と、また怒られる。

f:id:mzryuka:20220320223453p:plain


どうやら、中括弧はエスケープ文字ではエスケープできなさそう。
で、調べてみると、同じ文字を連続(「{」なら「{{」)でエスケープするっぽい。
ということで、修正してみる。
どうかな?

fn main() {
    println!("
      fn main() {{
        println!(\"Hello, World!\");
      }}
    ")
}

いけた!

f:id:mzryuka:20220320223308p:plain

*1:厳密には、ダブルクオーテーションで囲んだ文字列...と言うことになりますが。

*2:「波括弧」「Curly braces」とも言う。