urlに任意の文字が含まれているかどうかを確認する

April 12, 2021

ヘッダーにあるボタンの遷移先を URL によって変えたいことがあります。

こんな感じで書けます。Rails のお話です。

URL に/hoge か /hoge/があれば処理を変えたいのです。

- if request.path.match(/\/hoge(\/)?/)
  = render "shared/hoge"
- else
  = render "shared/home"

正規表現を使って処理を分岐させているわけです。

/スラッシュで囲んで書くと正規表現オブジェクトになります。

match(/\/hoge(\/)?/)

ここの部分で URL に/hoge が含まれているかを判定しています。

・\ は直後の正規表現記号をエスケープする。これないと //hoge ってなって、最初のふたつ目の/までを正規表現オブジェクトとしてしまう。

・(\/)はおなじく/を正規表現オブジェクトの終わりとしないため

・?は /hoge/を(たぶん)ひとまとまりとした文字が 0 個か 1 個のときにヒットする、、、あれ、、、0個じゃだめじゃね。いいのかな。よくないな

- if request.path.match(/\/hoge(\/)+?/)
  = render "shared/hoge"
- else
  = render "shared/home"

こっちが正解かな。

いや+は必要ない。

?は /hoge/を(たぶん)ひとまとまりとした文字が 0 個か 1 個のときにヒットする

この認識が間違ってますね。

(\/)?

これはあくまで / の一文字が 0 個か 1 個の場合にマッチする。

つまり、、、

request.path.match(/\/hoge(\/)?/)

これは /hoge または /hoge/ が含まれてればマッチするということですね。

結局のところ、下記で OK ですね。

- if request.path.match(/\/hoge(\/)?/)
  = render "shared/hoge"
- else
  = render "shared/home"

参考文献

[https://murashun.jp/article/programming/regular-expression.html:embed:cite]

[https://userweb.mnet.ne.jp/nakama/:embed:cite]

[https://rubular.com/:embed:cite]