0

だから基本的に私はこれらの文字列であるかどうかを検出したい:

こんにちは 123 私の 222 親愛なる 112 トロール 12 8889

192.1.1.254:10000

数値は次のような形式です: [0 ~ 255][ANYTHING][0 ~ 255][ANYTHING][0 ~ 255][ANYTHING][0 ~ 255][ANYTHING][0 ~ 65536]

このような正規表現を構築する方法を知っている人はいますか?

デフォルトの ip:port フィルターをバイパスするために、誰かが IP:Port を異常な形式で投稿したかどうかを検出するためのものです。

編集:最初のコメントについて:私は正規表現を知りません。私が試したことは次のとおりです:

if(regex_match("192.168 najlepszy serwer SAMP!!1 1 join1!! 8080","/^[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*)?$/"))
{
    print("Cannot send message");
}
else
{
    print("New message for everyone! :)");
}

およびその他の機能しない正規表現。

4

5 に答える 5

1

通常、パターンを正規表現として正確かつ単純かつ直接的に表現することはできません。その理由は数の範囲です。「この場所では、a から b までの値を持つ任意の整数」のようなものは複雑です。正規表現は有限状態マシンによって実行され、これらの (理論上の) ビーストは (基本的に) 文字列を 1 文字ずつしか見ることができません。したがって、「最初の数字が見つかるまですべての文字を無視し、最初の数字の後に最大 2 つの数字が続くかどうかを確認する」のようなものと一致させることができます。

回避策として、希望する値の範囲をカバーする可能な数字パターンの交互のリストを作成することを試みることができます (極端な場合、 のようなすべての単一の値をリストします\b(?:1|2|3|4|...|154|155|...|255)\b)。0 ~ 255 の範囲のパターンはありますが、可能なポート番号の範囲のパターンはありません。したがって、最初の概算は次のようになります (実際には、これは概算にすぎず、十分にテストされていません)。

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

上記のパターン(?: .... )では、恥ずかしがり屋のグループ (後方参照のために記憶されていない) を\b意味し、単語の境界を意味します。

于 2012-07-22T17:26:06.983 に答える
1

正確な範囲をチェックするために自分の生活を複雑にしたくない場合は、単純な正規表現は次のようになります。

/^.*(\d)+.+(\d)+.+(\d)+.+(\d)+.+(\d)+.*$/

最初の 4 つの(\d)+部分は、0 ~ 255 の範囲のより複雑なチェックに置き換えることができます。

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

最後の(\d)+は、ポート範囲チェックのために次のものに置き換えます。

(6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d\d\d|[1-5]\d\d\d\d|[1-9]\d{0,3})
于 2012-07-22T17:08:11.603 に答える
0

これには正規表現が必要ですか?私の意見では、これには正規表現は必要ありません。数字を数字以外の文字で区切られたグループに分割するだけです。次に分析します。

何語?

実際に有効な範囲を探すには、これを見てください。 http://www.regular-expressions.info/numericranges.html

于 2012-07-22T17:04:48.453 に答える
0

正規表現の構文を読んでおくことをお勧めします。手始め.に特別で、どんな文字にもマッチします。また、次のようなことをしても、9 は 0 ~ 5 の範囲内[0-2][0-5][0-5]にないため、次のようなものはキャッチされません。192

あなたの要件によると、ここにあなたが望むことを大まかに行う正規表現があります

([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*(\d{1,5})?

([0-2]?\d{1,2})部分は、オプションで 0、1、または 2 が前に付いた 1 桁または 2 桁の数字と一致します。それぞれ()がグループをキャプチャし、正規表現エンジンを使用して調べることができます。これらの各部分の正規表現は 255 を超える数値 (具体的には 256 ~ 299) と一致するため、このグループを調べる必要があります。

最後のグループ(\d{1,5})?は、ポート番号をキャッチすることです。ここでも、1 ~ 5 桁の任意の番号をキャッチするため、これを調べる必要があります (したがって{1,5})。は?、グループをオプションにします。ポート番号と照合する必要がある場合は、グループを削除します。

Cで正規表現を行う限り、私はあまり経験がありませんが、グループ化されたすべての一致を取得して検査する方法があるはずです。残念ながら、これらは文字列になるため、整数に変換して調べる必要があります。

于 2012-07-22T17:44:52.393 に答える
0

私はこの単純な正規表現を行います

((\d|\D)+)*
于 2012-07-22T17:10:40.230 に答える