ある日のこと。
後輩くんからこんな質問をされた。
後輩「先輩、この正規表現関数に出てくるr
ってどういう意味ですか?」
私「(やっべぇ、わかんねぇ…)」
私「あれじゃね?正規表現を表す的な。」
後輩「なるほどー!」
…すまない、後輩くん。
私は君に嘘をついてしまった。
日頃、何も気にせずr
をつけて正規表現関数を使っていたので、今回の質問をきっかけに調べてみた。
rのプレフィックス文字について
BigQueryには、下記正規表現関数が用意されている。
REGEXP_CONTAINS(email, r"@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+")
REGEXP_EXTRACT(email, r"^[a-zA-Z0-9_.+-]+")
REGEXP_REPLACE(heading, r"^# ([a-zA-Z0-9\s]+$)", "<h1>\\1</h1>")
第二引数の正規表現処理が走る文字列の先頭に、もれなくr
がついている。
公式の説明によると、
生の文字列のリテラル プレフィックス(r または R)を持つ、引用符または三重引用符付きのリテラルは、生のあるいは正規表現の文字列と解釈されます。
バックスラッシュ文字(\)はエスケープ文字としては機能しません。文字列リテラルの内部にバックスラッシュとそれに続く別の文字がある場合は、両方の文字が保持されます。
生の文字列は、奇数のバックスラッシュで終えることはできません。
生の文字列は正規表現を作成するのに便利です。
https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical?hl=ja
とのこと。
どうも理解しづらいため、もう少し噛み砕いてみる。
-
r
を文字列の先頭につけた場合、対象の文字列は生文字列もしくは正規表現文字列として処理されるよ。 - 文字列内では、(バックスラッシュ)によるエスケープ処理は走らないよ。
- 文字列の最後を奇数個の(バックスラッシュ)で終えるとエラーになるよ。
ってこと。
ちなみにr
は、raw string(生文字列)の頭文字からきている。
(正規表現のregexpのr
じゃなかったんだ…)
さて、r
のプレフィックス文字の仕様を理解したところで確認テストです。
下記のSQLをBigQueryで実行したら何が返ってくるでしょーか?
SELECT
REGEXP_CONTAINS('\\', r'\\') AS q1
, REGEXP_CONTAINS('\\', r'\\\\') AS q2
, REGEXP_CONTAINS(r'\\', r'\\\\') AS q3
答え
最後に
今まで理解せずに毎回つけてSQLを実行していたが、もしかしたら意図しない処理になっていたかもしれない。
皆さんも、仕様を理解せずに利用しているものがあれば、ミスを犯す前に一度調べてみましょー。
私たちのチームで働きませんか?
エイチームは、インターネットを使った多様な事業を展開する名古屋の総合IT企業です。
そのグループ会社である株式会社エイチームブライズでは、一緒に働く仲間を募集しています!
上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずはチャットでざっくばらんに話をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします!
Qiita Jobsよりメッセージお待ちしております!