Sprocketでよく使う正規表現の記述例

ここでは、Sprocketでよく利用する正規表現をご紹介します。正規表現は慣れないと難しく、特に複雑な条件や否定が交ざると正確に指定することが困難かもしれません。目的のものが見つかったら[記述例]をコピーして、サイトに合わせて書き換えてお使いください。

正規表現で使う記号の詳細については「正規表現について」を参照してください。

目次

正規表現を記述するときのポイント

まずはURLの法則性を日本語で整理する

正規表現を作る際にポイントとなるのは、URLの法則性を日本語で表すことです。

「カテゴリーIDは3桁の数字」「キッズカテゴリーはKで始まる」「全部で4つのディレクトリがある」「広告経由の場合は決まったパラメータが付く」など、URLの法則性を洗い出せていれば、複雑な正規表現を使わなくても、簡単な記述でミスなく設定しやすくなります。

整理の例 URLの例

カテゴリーIDは3桁の数字である

https://example.com/category-001/
https://example.com/category-003/
https://example.com/category-012/
キッズカテゴリは「k」で始まる https://example.com/k-shirt/
https://example.com/k-outer/
https://example.com/k-bottom/
全部で4つのディレクトリがある https://example.com/about/
https://example.com/casestudy/
https://example.com/faq/
https://example.com/company/
広告経由の場合は決まったパラメータが付く https://example.com/k-shirt/?utm_source=Instagram
https://example.com/k-outer/?utm_source=Instagram
https://example.com/k-bottom/?utm_source=Instagram

間違いやすいポイントを押さえる

正規表現で特別な意味を持つ「.」や「?」などの記号を文字として指定したいときは、直前にエスケープ文字を入れて「\.」や「\?」と記述します。

URLに含まれる記号で、エスケープをする必要があるものと必要がないものは以下のとおりです。特にパラメータを表す「?」のエスケープが見落とされがちですので、パラメータを扱う際は注意してください。

エスケープする必要がある記号

.(ピリオド) ?(クエスチョン) +(プラス) ^(ハット)

エスケープする必要がない記号

/(スラッシュ) -(ハイフン) =(イコール) #(シャープ) &(アンパサンド)

「.」(ピリオド)はエスケープしなくていい場合も多い

「.」(ピリオド)は、正規表現では「いずれかの1文字」を表し、その中には「.」(ピリオド)自身も含まれます。従って「sprocket.bz」などのドメイン部分はエスケープをしなくてもマッチします。

正確に言うと「.」(ピリオド)以外の1文字も対象となるので「sprocket-bz」やsprocketabz」もマッチしてしまいますが、Sprocketタグが実装されているドメインは決まっているので、これが問題になることはほぼありません。

「-」(ハイフン)は「[ ]」の中のみエスケープが必要

「-」(ハイフン)は、通常は特に正規表現の意味を持たないのでエスケープする必要はありません。しかし「[ ]」で囲まれた場合は「-」(ハイフン)が特別な意味を持つため、「[ ]」内ではエスケープが必要です。

「[ ]」の囲みは「文字クラス」と呼ばれ、括弧の中に書かれたいずれかの1文字とマッチします。文字クラスで「[0-9]」のように書くと「0から9の数字」という範囲を表しますので、「0と-(ハイフン)と9」という3つの文字をマッチさせたい場合は「[0\-9]」とする必要があります。

正規表現が正しいかを確認する方法

Sprocketで正規表現を利用できる場所は、行動データの[行動するきっかけ]、セグメントの[ユーザー条件]、ステップの[表示するページURL]などがあります。

それぞれの場所にある[この条件でテストする]あるいは[このURL条件で、対象ページのURLをテストする]をクリックすると、入力した記述でどのURLが対象となり、どのURLが対象外となるかを確認できます。正規表現を記述したときは、必ず実際のURLを複数入力して指定が正しいか確認してください。

img-01.png

正規表現を入力したら[この条件でテストする]をクリックする

img-02.png

目的のURLをいくつか入力してみて正しく指定できているか確認する

ケース1:ページやディレクトリの指定

複数のページやディレクトリを同時に指定したい

半角の「( )」内で「|」(パイプ)を使うことで「AまたはB」を指定できます。最後の「$」は「末尾である」ことを表し、その後にURLが続く場合はマッチしなくなります。

目的 「https://www.sprocket.bz/AAA」か「https://www.sprocket.bz/BBB」か「https://www.sprocket.bz/CCC」のいずれかの場合のみを対象としたい
記述方法 (AAA|BBB|CCC)
記述例

//www.sprocket.bz/(AAA|BBB|CCC)$

途中にさまざまな商品IDが含まれる場合もすべて対象としたい

「[0-9]」の記述は「0から9までの数字どれか1文字」を表します。その後の「{5}」はくり返しの回数です。ここの例では「5桁の数字なら何でも対象とする」という意味になり、URLの途中にある商品IDやカテゴリーIDなどの数字が変動する場合も、柔軟な指定が可能になります。

目的 「https://www.sprocket.bz/item_id/XXXXX/feature/」の「XXXXX」の部分にどんな商品ID(ここでは5桁の数字)が入っても、すべて対象に含めたい
記述方法 [0-9]{5}
記述例 //www.sprocket.bz/item_id/[0-9]{5}/feature/

ケース2:表記ゆれをまとめる指定

同じページでも、URLの末尾に「index.html」などのファイル名やパラメータが付く場合があります。

「https://www.sprocket.bz/」のように直接URLだけを指定すると、ファイル名やパラメータが付いた場合に対象となりません。よくある表記ゆれを解消し、すべてを対象に含めて漏れをなくす記述方法です。

末尾にindex.htmlやパラメータが入っていても対象としたい

主にトップページなどで「index.XXX」「default.XXX」といったファイル名や、「?」のパラメータ、「#」のフラグメントが付いていても全部対象とします。

例では最後に「$」を付けているので基本的にURLはそこで終わりですが、「( )?」(あってもなくても)を利用して、「index~」「default~」「?~」「#~」のパターンだけを特別に許容するという考え方です。

目的 「https://www.sprocket.bz/」の後ろに「index.html」や「default.php」などのファイル名、パラメータがついてもすべてを対象としたい
記述方法 (index\..*|default\..*)?(\?.*)?(#.*)?$
記述例 //www.sprocket.bz/(index\..*|default\..*)?(\?.*)?(#.*)?$

末尾に何かしらのパラメータが付いていても対象としたい

上記の例から対象に含める範囲を「?」と「#」だけに絞った記述で、個別のページに広告やメールマガジンから流入がある場合に適しています。URLの末尾に「?」のパラメータや「#」のフラグメントが付いていてもマッチします。上記の例と同様に末尾を表す「$」があるので、それ以外の文字列が続く場合は、不一致となります。

目的 「https://www.sprocket.bz/category/book.html」の後ろにパラメータがついても対象としたい
記述方法 (\?.*)?(#.*)?
記述例 //www.sprocket.bz/category/book.html(\?.*)?(#.*)?$

末尾に「/」(スラッシュ)があってもなくても対象としたい

「?」は直前にある文字が「0回または1回」を表しますので、直前にある「/」があってもなくてもマッチします。

目的 「https://www.sprocket.bz/ABC」または「https://www.sprocket.bz/ABC/」のいずれかを対象としたい
記述方法 /? 
記述例 //www.sprocket.bz/ABC/?$

ケース3:特定のURLを除外する指定

例えば「サイトの中で、マイページとご利用ガイドは除外」のように、特定のページだけを除外する指定も可能です。ただし、除外(否定)の記述は正規表現で混乱しやすいポイントでもあります。

除外を表すには、大きく2つの記述方法があります。

  • [^...](否定文字クラス):そこに何かしらの「1文字」があることが確定しているときに、それが条件を満たす1文字だった場合は除外する
  • (?!...)(否定先読み):ある特定の「文字列」が続く場合のみ除外して、ほかの文字列があるときは対象とする

否定文字クラスは、「[^0-9]」(0から9の数字だったら除外、アルファベットや記号ならOK)のように使われます。また、「任意の1階層」を「[^/]+」で表すこともあります。「+」は「1文字以上の任意の文字列」(つまり何でも)を表しますが、そのままでは「item/mens/outerwear」などの複数の階層をまたいだ文字列もマッチしてしまいます。「/」を除外することで、「/」が入らない任意の1階層を指定できるわけです。

否定先読みは、「もしそのパターンが続いたらマッチしない」という用途で利用します。1文字ではなく文字列で指定できるので、除外したいパラメータ名やディレクトリ名が明確な場合に、狙い撃ちで除外の指定を行えます。パラメータについては、次の項目でも詳しくご紹介します。

特定の数字で始まる商品群を除外したい

例えば、商品IDを表すURLが5桁の数字で、中古商品だけは対象外にしたいとします。中古商品が「3または4で始まる5桁」と決まっている場合は、「[^34]」と指定することで、中古商品のURLを除外できます。2桁目以降に数字が4つ続くことは[0-9]{4}で表しています。

なお「商品IDが1から5で始まる」と決まっている場合は、否定を使わずに「[125]」で「1か2か5」と直接指定しても構いません。「[^34]」は、3と4以外のアルファベットや記号もすべて対象になります。

目的 「https://www.sprocket.bz/30014」などのURLで「3」か「4」で始まるファイル名を除外したい
記述方法 [^34]
記述例 https://www.sprocket.bz/[^34][0-9]{4}$

特定のディレクトリ配下で、セールページだけを除外したい

「sale」というページやディレクトリを狙い撃ちで除外したい場合は、否定先読みで「(?!sale)」と指定します。「sale」というページやディレクトリが出てきた場合に対象外となり、それ以外のすべての文字列が対象となります。

目的 「https://www.sprocket.bz/shop/配下」かつ「https://www.sprocket.bz/shop/sale/」は対象外にしたい
記述方法 (?!sale)
記述例 //www.sprocket.bz/shop/(?!sale)

カラーが「黒」と「白」の商品だけを除外したい

商品のカラーバリエーションで型番が分かれていて、赤が「r」、青が「b」、黒が「k」、白が「w」など規則性がある場合は、特定の色だけを除外する指定も可能です。

目的 「https://www.sprocket.bz/?id=3030k」など「商品ID4桁+色を表すアルファベット」となるURLで、黒を表す「k」と白を表す「w」に該当する場合は除外したい
記述方法 [0-9]{4}[^kw]
記述例 https://www.sprocket.bz/\?id=[0-9]{4}[^kw]$

ケース4:パラメータの指定

URLに付くパラメータは、一般的にメールマガジンや広告などの流入経路や、カテゴリー・商品などを表します。特定のパラメータで条件を制御したい場合は、パラメータを直接指定して正規表現を記述します。

URLのパラメータは1つ目は「?」で始まりますが、複数のパラメータが付与される場合、2つ目以降は「&」で連結されます。従って、2つ目以上にも登場する可能性があるパラメータを指定する場合は「(\?|&)」(「?」か「&」いずれかに続く。「?」はエスケープが必要)と記述します。

特定のパラメータが付く場合のみを指定したい

広告やメールマガジンからの流入など、特定のパラメータが付与されたURLを条件にしたい場合は、そのパラメータを条件に正規表現を記述します。個別のページがパラメータを使ったURLになっている場合も同様です。

以下の例では、パラメータが1番目にあっても2番目以降にあっても対応する記述方法になっています。「(.*&)?」部分が「何かのパラメータがあってもなくても」という意味を表し、ある場合は「&id=100A」となり、ない場合は「?id=100A」が残るという書き方です。システムが順不同でパラメータを付ける場合にも対応できます。

メールマガジンに手動でパラメータを設定する場合など、パラメータが1つ目に付くことがわかっている場合は、「(.*&)?」部分を除いてシンプルに「\?id=100A($|&|#)」と指定すればOKです。

目的 「https://www.sprocket.bz/?id=100A」のURLで「100A」のパラメータが付いているときのみを対象にしたい
記述方法 \?(.*&)?id=100A($|&|#)
記述例 https://www.sprocket.bz/\?(.*&)?id=100A($|&|#)

特定のパラメータが付く場合を除外したい

「メールマガジンからの流入は、説明が重複するので除外したい」など、特定のパラメータが付与されたURLを除外したい場合は、否定先読みの「(?!)」で除外したいパラメータを記述します。

以下の例は複雑に見えますが、前半の「(?!.*((/?|&)id=(100A|200B|300C)($|&|#)))」が「URLのどこかにid=100Aかid=200Bかid=300Cのパラメータがあったら除外」を表し、後半の「(\?.*)?(#.*)?$」は前半で紹介した「末尾に何かしらのパラメータが続いても対象としたい」と同様の記述です。

目的 「https://www.sprocket.bz/?id=100A」などのURLで「100A」「200B」「300C」のいずれかに該当する場合は除外したい
記述方法 (?!.*((\?|&)id=(100A|200B|300C)($|&|#)))(\?.*)?(#.*)?$
記述例 https://www.sprocket.bz/(?!.*((\?|&)id=(100A|200B|300C)($|&|#)))(\?.*)?(#.*)?$

特定のパラメータが付く場合を対象にするが、さらに特定のパラメータが続く場合は除外したい

パラメータの指定と除外を組み合わせた例です。否定先読みの「(?!)」の後に除外したいパラメータを指定すると、指定したパラメータがある場合のみが除外され、ほかのパラメータが続く場合や、何もパラメータが続かない場合は対象となります。

目的

「https://www.sprocket.bz/?id=100A&utm_medium=email」などのURLで「100A」「200B」「300C」のいずれかに該当する場合を対象としつつ、メールマガジン経由を表す「utm_medium=email」が含まれる場合は特別に除外したい

※なお「utm_medium=email」は「id=XXX」よりも後ろに来ることがわかっているものとする

記述方法 (\?(.*&)?id=(100A|200B|300C)($|&|#))(?!.*(utm_medium=email($|&|#)))
記述例 https://www.sprocket.bz/(\?(.*&)?id=(100A|200B|300C)($|&|#))(?!.*(utm_medium=email($|&|#)))

ケース5:ドメインの指定

スマートフォン向けのサイトとPC向けのサイト、本番環境とテスト環境などでドメインが変わる場合に、どちらも対象とするように指定したい場合があります。ドメインの場合も基本的な考え方は同じです。「( | )」(または)と「( )?」(あってもなくても)で指定します。

スマートフォンと PC でドメインが異なるが、両方とも対象としたい

スマートフォンとPCでドメインが一部異なる場合は、差分を「( )?」(あってもなくても)で指定することで、両方のドメインを対象とできます。

具体例 「https://www.sprocket.bz/」または「https://www.sprocket_sp.bz/」でも対象としたい
記述方法 (_sp)?
記述例 //www.sprocket(_sp)?.bz/

本番環境と検証環境でドメインが異なるが、両方とも対象としたい

上記の例と同様、検証環境でドメインが一部異なる場合は、差分を「( )?」(あってもなくても)で指定します。

具体例 「https://www.sprocket.bz/」または「https://www.sprocket_test.bz/」でも対象としたい
記述方法 (_test)?
記述例 //www.sprocket(_test)?.bz/

サブドメインがあってもなくても対象としたい

「www」や「shop」など、サブドメインがある場合とない場合のURLも、「( )?」(あってもなくても)で指定します。サブドメインの場合はドメインよりも前に正規表現を記述します。

具体例 「https://sprocket.bz/」または「https://aaa.sprocket.bz/」でも対象としたい
記述方法 (aaa\.)?
記述例 //(aaa\.)?sprocket.bz/

 

記述した正規表現は、このページの最初にご紹介した方法で必ず動作を確認してください。どのような正規表現を記述すればよいかわからない場合は、担当コンサルタントまでご相談ください。

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています