URLにマッチする正規表現をRFC3986を考慮して実装する【JavaScript】
やりたいこと
Node.jsのバリデーション処理で正常なURLかを判定したい時があり、そのためだけにライブラリを使うまでもなかったので自前で正規表現を考える。要件は以下の通り。
- プロトコル(http or https)が必須
- 末尾のスラッシュを許容
- サブドメイン(ホスト名)を許容
- 再帰的なサブディレクトリを許容
- TLDが必須
- クエリパラメータ・ハッシュ・ポート番号それぞれを許容
- 非予約文字・予約文字それぞれを許容
特殊文字について
pchar = unreserved / pct-encoded / sub-delims / ”:” / ”@”
query = *( pchar / ”/” / ”?” )
fragment = *( pchar / ”/” / ”?” )
pct-encoded = ”%” HEXDIG HEXDIG
unreserved = ALPHA / DIGIT / ”-” / ”.” / ”_” / ”~“
reserved = gen-delims / sub-delims
gen-delims = ”:” / ”/” / ”?” / ”#” / ”[” / ”]” / ”@“
sub-delims = ”!” / ”$” / ”&” / ”’” / ”(” / ”)”
/ ”*” / ”+” / ”,” / ”;” / ”=”RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
許容する特殊文字はRFC3986に準拠した上記のもののみに限定する。
正規表現(結論)
ユニットテストで検証
上記のような関数を作成しユニットテストで検証してみる。
全てパスしたので問題なさそう。