質問: 例えば、こんなURLがあった場合 `https://www.example.com/test/?q=test&s=test` `https://www.example.com/hoge/?q=foo&s=faa#hoge` クエリパラメータのみを除外して、以下のURLとハッシュは抽出したい。 `https://www.example.com/test/` `https://www.example.com/hoge/#hoge` これを正規表現で実現することはできますでしょうか? アドバイスいただければ幸いです。
回答: * `#` はフラグメント開始以外には現れない * `#` より前の一番最初の `?` はクエリの開始 + ただし、クエリ内やフラグメント内に`?`が現れることがある この性質を利用すれば正規表現置換で簡単に実現できるでしょう。例えば `^([^?#]*)(\?[^#]*)?(#.*)?$` この正規表現で1番目と3番目の グループを残せば希望の動作になるかと思います。 RFC 3986 にURIの正規表現が載っています。参考になると思います。 ``` ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9 ``` また、プログラミング言語によってはURL/URIを表現するライブラリが用意されているので、正規表現を使うよりそちらを使うほうがわかりやすいコードになるかも知れません。