LoginSignup
17
8

More than 3 years have passed since last update.

BigQueryのプレフィックス文字を理解する

Last updated at Posted at 2019-12-07

ある日のこと。
後輩くんからこんな質問をされた。

後輩「先輩、この正規表現関数に出てくる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


答え
q1 q2 q3
true false true

q1の解説

第一引数の\\はエスケープ処理が走り、\になる。
第二引数の\\はエスケープ処理が走らないが、正規表現により\になる。
よって、trueが返ってくる。

q2の解説

第一引数の\\はエスケープ処理が走り、\になる。
第二引数の\\はエスケープ処理が走らないが、正規表現により\\になる。
よって、falseが返ってくる。

q3の解説

第一引数の\\はエスケープ処理が走らないため、\\になる。
第二引数の\\はエスケープ処理が走らないが、正規表現により\\になる。
よって、trueが返ってくる。


最後に

今まで理解せずに毎回つけてSQLを実行していたが、もしかしたら意図しない処理になっていたかもしれない。
皆さんも、仕様を理解せずに利用しているものがあれば、ミスを犯す前に一度調べてみましょー。

私たちのチームで働きませんか?

alt
エイチームは、インターネットを使った多様な事業を展開する名古屋の総合IT企業です。
そのグループ会社である株式会社エイチームブライズでは、一緒に働く仲間を募集しています!

上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずはチャットでざっくばらんに話をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします!

Qiita Jobsよりメッセージお待ちしております!

17
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
8