質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

IPアドレスの正規表現について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 7,234

poponta

score 12

前提・実現したいこと

Javascriptにてシステムを作成しています。

IPアドレス入力のバリデーションにおいて、
正規化表現を利用しようと思っています。

X.X.X.Xだけの正規表現は検索して解決しましたが、
X.X.X.X/Yのようなサブネットを含む表現は解決できていません。

どのように表記すればよろしいでしょうか?

X.X.X.X~Z.Z.Z.Zという範囲を求めるのではなく、
X.X.X.X/Yという入力表記が正しいかどうかを判断したいです。

試したこと

X.X.X.Xなら
/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/
でいけました。

お手数をおかけしますが、ご回答お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ikedas

    2017/03/27 17:27

    他の手段ではなく正規表現を利用する理由は何ですか。

    キャンセル

  • poponta

    2017/03/27 17:30

    正確に言うとExtJSでプログラムを組んでいて、入力時のバリデーションが正規表現で実現できるためです、

    キャンセル

回答 3

checkベストアンサー

+5

IPv4 アドレスの表記で aaa.bbb.ccc.ddd/zz の /zz の部分は「ネットワークアドレスのビット長」を指しているので、zz が 0~32 の間の数値であれば問題がありません。
例えば 192.168.0.2/24 という表記は全くもって正しいです(これだとサブネットマスクが 255.255.255.0 であるネットワークであることを明示しているだけ)。

ですから、上の条件に合致するだけであれば、今の IP アドレスの正規表現に加えて、末尾に (/([0-9]|[1-2][0-9]|3[0-2])){0,1} を加えるだけでよいはずです。
※/ で始まり、0~32 の数値が続く文字列が、0ないし1回出現する

192.168.0.0/24 という表記は CIDR といって、厳密には違います。こちらだと 192.168.0.0 ~ 192.168.0.255 という「ネットワークアドレスの範囲」を示していると取られます。(どちらを意味しているかは文脈で判断するしかない)
これに合致しているかどうかということになると、正規表現でやらない方がよいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 08:54

    ご回答ありがとうございました。
    教えていただいた表現でうまくいきました。
    助かりました。

    キャンセル

+3

IPアドレスは一桁や二桁の数値の場合0で頭を埋めるケースもあるので
なにをもって正しいとするか定義されていないと意味がない質問です。
また直接0が入ることも想定したほうがよいです

たとえばこんな感じで抜き出した上で数値の整合性をチェックしたほうがよいかも

var str="10.1.2.3";
var reg=new RegExp("^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$");
console.log(str.match(reg).filter(function(i,j){return (j>0 && i>=0 && i<=255);}).length==4);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 18:20 編集

    To: tacsheaven さん
    > 大元の RFC952 では単に digit (#)としか記述しておらず、
    「<octet> ::= <0 to 255 decimal>」の部分でしょうか。
    それでも「0パディング数値を8進数として扱う」規定はないので実装依存になる問題は残ってしまうのですね。
    実装依存な挙動に頼った実装をすると痛い目を見る事が多いので、個人的には「0パディングしたIPv4アドレス」お勧めしがたい文法ではあります。
    https://tools.ietf.org/html/rfc952

    To: yambejp さん
    > 先頭に関してはたしかに0はじまりはNGですね。
    > まぁ一般に010は8ですからね
    > ただ前回の補足にも「10.001.002.003」は有効って書きましたよね?
    「先頭」は第一オクテットを表しているのでしょうか。
    第二オクテット以下が 0*[0-7] で構成されているので第二オクテット以下の8進数値/10進数値が同値になっていますが、http://10.001.002.030/ なら http://10.1.2.24/ になりますので、第一オクテットだけ「0パディング数値」を除外する意味はないと思います。
    「8進数IPv4アドレス」と「10進数IPv4アドレス」の表記ゆれを防ぐなら「各オクテット数値が7以下の場合に限り、前方を0パディングしても良い」のルールに則って正規表現を書くべきですが、正規表現が複雑化するだけでメリットがないように思いました。

    > 質問者さんの定義が正しいのであってRFCに準拠する必要はありません
    そうかもしれませんが、仕様違反の問題を認識していながら「質問者の要件だけ」を忠実に再現するのは不親切な気がたので横入りしてしまいました。お節介ですみません。

    キャンセル

  • 2017/03/28 20:28

    think49さんの仰る通りでした、完全に思い込みでした
    これについては申し開きようがありません、申し訳ないです。

    キャンセル

  • 2017/03/28 20:39 編集

    あらためて考えると255.255.255.255まで考慮すると
    「0377.0377.0377.0377」までが理論的に有効ですね
    ただしOSによって挙動が違うようです。
    当然0で埋める場合もっと桁数が上がっても良いので
    理論的には正しくても運用できないものになりそうです。
    (例えば000000001.2.3.4だって構わないわけだから)

    また例えば0.0.0.0を有効とする場合など想定が必要になり
    正規表現でチェックするには多少無理があるようです

    キャンセル

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/27 17:37

    これ、バリデーションに使えますか? エスケープするだけじゃ?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る