🙄

JavaScriptでパスの末尾のスラッシュを除去する

2022/10/23に公開

location.pathname で得られる '/foo''/foo/' のようなパス名から、末尾のスラッシュを除去した文字列を得る方法の例を挙げる。

結論

// OK例
'/foo/bar/'.replace(/(.+)\/$/, '$1') // => '/foo/bar'
'/foo/bar/'.replace(/(.+)\/$/, (_, p1) => p1) // => '/foo/bar'
'/foo/bar/'.replace(/(?<!^)\/$/, '') // => '/foo/bar'

// NG例
'/'.replace(/\/$/, '') // => ''

OK例

パターン1. 末尾スラッシュより前の部分を残す

全体をマッチさせ、末尾スラッシュより前の部分のみをキャプチャして残す。

特殊文字列で置き換える場合

// マッチした場合、キャプチャ部分が'$1'に挿入される
'/foo/bar/'.replace(/(.+)\/$/, '$1') // => '/foo/bar'

// マッチしない場合は、そのままの文字列が返る
'/foo/bar'.replace(/(.+)\/$/, '$1') // => '/foo/bar'

関数で置き換える場合

// マッチした場合、キャプチャ部分が第二引数に与えられる
'/foo/bar/'.replace(/(.+)\/$/, (_, p1) => p1) // => '/foo/bar'

// マッチしない場合は、そのままの文字列が返る
'/foo/bar'.replace(/(.+)\/$/, (_, p1) => p1) // => '/foo/bar'

→ 正規表現は比較的単純だが String.prototype.replace() の仕様の知識が必要

パターン2. 末尾スラッシュを削除する

否定後読みで、先頭以外の末尾スラッシュのみをマッチさせ、空白文字に置換する。

'/foo/bar/'.replace(/(?<!^)\/$/, '') // => '/foo/bar'

replace の使い方は単純だが、正規表現の知識がより必要

NG例

location.pathname.replace(/\/$/, '') のように、単純に末尾のスラッシュのみを削除すると、 '/' (ルート) が '' になってしまう。

// ルート以外では機能するが
'/foo/bar/'.replace(/\/$/, '') // => '/foo/bar'

// ルートの場合に、空文字列になってしまう
'/'.replace(/\/$/, '') // => ''

Discussion