139

IPv4 検証用の効率的な正規表現を取得しようとしてきましたが、うまくいきませんでした。ある時点で私はそれを持っていたように見えましたが(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}、奇妙な結果が得られました:

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

これがすでに尋ねられて回答されているかどうかを確認するために検索を行いましたが、他の回答は、1〜3個の数字の4つのグループを決定する方法を単に示しているように見えるか、私にとってはうまくいきません.

4

43 に答える 43

118

すでに有効な回答を得ていますが、元のアプローチの何が問題だったのか知りたい場合に備えて、代替の周りに括弧が必要です。それ以外の(\.|$)場合は、数が 200 未満の場合にのみ必要です。

'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'
    ^                                    ^
于 2011-03-12T18:08:06.197 に答える
104
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

受け入れる:

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01        # This is an invalid IP address!

拒否:

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
1.1.1.1.
3...3

単体テストをオンラインで試す: https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1

于 2014-09-22T07:46:17.580 に答える
92

最新、最短、最も読みにくいバージョン ( 49 文字)

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$

ブロックは2 か所[0-9]で置き換えることができます\d- 少し読みにくくなりますが、間違いなく短くなります。

さらに新しく、さらに短く、2 番目に読みにくいバージョン ( 55 文字)

^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$

このバージョンは 250-5 ケースを探し、その後、可能なすべてのケースの論理和を巧みに計算し200-249 100-199 10-99ます。|)この部分は間違いではありませんが、実際には 0 ~ 9 の範囲の最後のケースを OR していることに注意してください。また、キャプチャされたアイテムをあまり気にしないため、非キャプチャ グループの部分も省略しまし?:た。最初に完全な一致がなければ、キャプチャされません。

古くて短いバージョン (読みにくい) ( 63 文字)

^(?:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(?!$)|$)){4}$

古い(読み取り可能な)バージョン(70文字

^(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(\.(?!$)|$)){4}$

否定先読み(?!)を使用して、IPがで終わる可能性のあるケースを削除します.

いくつかの新しい手法を使用した別の回答 ( 71 文字)

^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d)$

先読みがサポートされていない正規表現の実装で役立ちます

最も古い回答 ( 115 文字)

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}
    (?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

これは最も正確で厳密な正規表現だと思います。ここでの他のほとんどの回答のように受け入れられず、000.021.01.0.そのようなケースを拒否するために追加の正規表現が必要です-つまり0、開始番号とで終わるip.

于 2016-04-21T05:01:16.967 に答える
14

IPv4 アドレス (正確なキャプチャ) 0.0.0.0 ~ 255.255.255.255 に一致しますが、1.1.000.1 などの無効なアドレスもキャプチャします。この正規表現を使用して、IP 番号を正確に一致させます。4 つの数値はそれぞれキャプチャ グループに格納されるため、それらの数値にアクセスしてさらに処理することができます。

\b
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\b

JGsoft RegexBuddy ライブラリから取得

編集:この(\.|$)部分は奇妙に思えます

于 2011-03-12T17:33:27.277 に答える
2

他のすべての回答から正規表現を構築することができました。

(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)(\.(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]|[0-9]?)){3}
于 2015-10-12T11:52:02.080 に答える
0
    const char*ipv4_regexp = "\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\."
    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";

JGsoft RegexBuddy ライブラリから取得した正規表現を C 言語 (regcomp/regexec) に適用したところ、動作することがわかりましたが、Linux などの一部の OS では少し問題があります。その正規表現は 192.168.100.009 のような ipv4 アドレスを受け入れます。Linux の 009 は 8 進数と見なされるため、アドレスはあなたが考えたものではありません。その正規表現を次のように変更しました。

    const char* ipv4_regex = "\\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
           "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

その正規表現を使用すると、192.168.100.009 は有効な ipv4 アドレスではありませんが、192.168.100.9 は問題ありません。

マルチキャストアドレスの正規表現も変更しました。それは次のとおりです。

    const char* mcast_ipv4_regex = "\\b(22[4-9]|23[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]?)\\."
                        "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\b";

アプリケーションの開発に使用している言語に正規表現を適応させる必要があると思います

私はJavaで例を挙げました:

    package utility;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class NetworkUtility {

        private static String ipv4RegExp = "\\b(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d?)\\b";

        private static String ipv4MulticastRegExp = "2(?:2[4-9]|3\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d?|0)){3}";

        public NetworkUtility() {

        }

        public static boolean isIpv4Address(String address) {
            Pattern pattern = Pattern.compile(ipv4RegExp);
            Matcher matcher = pattern.matcher(address);

            return matcher.matches();
        }

        public static boolean isIpv4MulticastAddress(String address) {
             Pattern pattern = Pattern.compile(ipv4MulticastRegExp);
             Matcher matcher = pattern.matcher(address);

             return matcher.matches();
        }
    }
于 2014-08-10T08:27:42.297 に答える
0

これが一番短いと思います。

^(([01]?\d\d?|2[0-4]\d|25[0-5]).){3}([01]?\d\d?|2[0-4]\d|25[0-5])$
于 2016-09-09T08:38:40.030 に答える
0

簡単な方法

((25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]{0,1})\.){3}(25[0-5]|2[0-4][0-9]|[1][0-9][0-9]|[1-9][0-9]{0,1})

デモ

于 2018-12-18T14:15:17.160 に答える
0

私の[拡張]アプローチ→スペースで区切られたIPアドレスの正規表現:

((((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\\.(?=\\d)|(?!\\d))){4})( (?!$)|$))+

PCRE 先読みを使用します。

于 2020-10-19T13:27:48.320 に答える
0
ip address can be from 0.0.0.0 to 255.255.255.255

(((0|1)?[0-9][0-9]?|2[0-4][0-9]|25[0-5])[.]){3}((0|1)?[0-9][0-9]?|2[0-4][0-9]|25[0-5])$

(0|1)?[0-9][0-9]? - checking value from 0 to 199
2[0-4][0-9]- checking value from 200 to 249
25[0-5]- checking value from 250 to 255
[.] --> represent verify . character 
{3} --> will match exactly 3
$ --> end of string
于 2018-09-03T16:15:27.630 に答える
0

PCRE とdefineキーワードを使用します。

/^
 ((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))$
 (?(DEFINE)
     (?<byte>25[0-5]|2[0-4]\d|[01]?\d\d?))
/gmx

デモ: https://regex101.com/r/IB7j48/2

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)これは、パターンを 4 回繰り返さないようにするためです。以下のような他のソリューションはうまく機能しますが、多くの人から要求されるため、各グループをキャプチャすることはできません。

/^((\d+?)(\.|$)){4}/ 

4 つのキャプチャ グループを持つ他の唯一の方法は、パターンを 4 回繰り返すことです。

/^(?<one>\d+)\.(?<two>\d+)\.(?<three>\d+)\.(?<four>\d+)$/

したがって、perl で ipv4 をキャプチャするのは非常に簡単です。

$ echo "Hey this is my IP address 138.131.254.8, bye!" | \
  perl -ne 'print "[$1, $2, $3, $4]" if \
    /\b((?&byte))\.((?&byte))\.((?&byte))\.((?&byte))
     (?(DEFINE)
        \b(?<byte>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
    /x'

[138, 131, 254, 8]
于 2018-06-09T11:48:07.753 に答える
-1

これは私にとって正規表現です:
"\<((([1-9]|1[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([1-9]|1[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))\>"

于 2016-10-16T18:17:49.203 に答える
-3
mysql> select ip from foo where ip regexp '^\\s*[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]\\s*';
于 2012-01-23T18:15:40.990 に答える
-3
String zeroTo255 = "([0-9]|[0-9][0-9]|(0|1)[0-9][0-9]|2[0-4][0-9]|25[0-5])";

it can contain single digit i.e ([0-9]);  
It can contain two digits i.e ([0-9][0-9]); 
range is (099 to 199)i.e((0|1)[0-9][0-9]); 
range is (200 - 249) i.e (2[0-9][0-9]) ; 
range is (250-255) i.e(25[0-5]);
于 2017-01-03T02:10:04.960 に答える