この正規表現を使用して(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}
ポート番号を検証しています。どういうわけかこれは機能していません。これの何が問題になっていますか?誰かが私を指摘できますか?
13 に答える
働いていないというのはどういう意味ですか?
あなたはそのような何かを試すことができます:(ここ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
から得られます)。
0
これにより、指定された文字列が数値であり、との範囲内にあることが確認されます65535
。
正規表現が同じ範囲に一致すると仮定すると、開始アンカーと終了アンカー(^
および$
それぞれ)が欠落しているため、実際のポート以外の他の文字列が許可されます。
更新2022年2月2日:などの値を拒否するように正規表現を修正しました00
。更新された正規表現は、以下のコメントから提供されています。この正規表現は、 https://www.debuggex.com/r/jjEFZZQ34aPvCBMAでよりよく理解および視覚化できます。
Googleで「ポート番号を検証する方法」を検索すると、残念ながらここに到着します
ただし(他に選択肢がない場合を除く...)、
正規表現は明らかにポート番号を検証する方法ではありません!
「1つの」(少し良い)方法は次のようになります。
step 1: Convert your string into number, and return FALSE if it fails
step 2: return TRUE if your number is in [1-65535] range, and FALSE otherwise
さまざまな理由、なぜ正規表現が正しい方法ではないのですか?
- コードの読みやすさ(理解するのに数分かかります)
- コードの堅牢性(タイプミスを導入するにはさまざまな方法があり、単体テストが必要になります)
- コードの柔軟性(ポート番号を64ビット番号に拡張できる場合はどうなりますか!?)
- など..。
Number()は、「123a」がNANを返す必要のある関数です。
parseInt()は、末尾の文字「123a」を切り捨てて123を返します
<input type="text" id="txtFld" onblur="if(Number(this.value)>0 && Number(this.value)<65536){alert('valid port number');}" />
これは、ファイアウォールのポート設定を検証するために使用している例です。元の回答は2つの文字列に一致します。一致する文字列は1つだけです。
(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[1-9](\d){0,3})
取得するには:22,24:100,333,678,100:65535
私の完全な検証(1つの一致のみを返します)は
(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3})(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}))?(,(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}){1}(:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9][0-9]|6[0-4][0-9][0-9][0-9][0-9]|[1-5](\d){4}|[0-9](\d){0,3}))?)*
より厳密なアプローチは、5桁までのすべての数字を次の文字列と一致させる正規表現を使用することです。
*(^[1-9]{1}$|^[0-9]{2,4}$|^[0-9]{3,4}$|^[1-5]{1}[0-9]{1}[0-9]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-4]{1}[0-9]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-5]{1}[0-4]{1}[0-9]{1}[0-9]{1}$|^[1-6]{1}[0-5]{1}[0-5]{1}[0-3]{1}[0-5]{1}$)*
npintiによる容認された答えは正しくありません。たとえば、ポート番号1000を入力することはできません。私にとって、これは(良くない、私は初心者です)正しく機能します:
/^((((([1-9])|([1-9][0-9])|([1-9][0-9][0-9])|([1-9][0-9][0-9][0-9])|([1-6][0-5][0-5][0-3][0-5])))))$/
これは、0で始まるポートを除外する単一ポートの正規表現検証です。
^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])
ポート範囲の検証は次のとおりです(例:1111-1111)
^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(-([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$
リンク:
"^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0-9]{1,4}))$"
0〜65535までのすべてが許可されます。
ここにも着陸し、ポート番号を検証するためにREGEXを特に検索しました。承認されたソリューションは、すべてのシナリオ(007ポートなど)および他のサイトのソリューションも更新されていない(例)をカバーするようにまだ修正されていないようです。
と同じ最小ソリューションに到達しました。これは、範囲を適切saber tabatabaee yazdi
にカバーする必要があります。1-65535
^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
楽しみ !
@npintiの回答では、ポート番号の先行ゼロが許可されています。また、ポート0は、使用可能なポートを選択することを意味するため、正規表現が次のようになるように除外します。
^([1-9][0-9]{0,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
ポート0を許可する場合は、
^(0|[1-9][0-9]{0,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
ソリューション:
Dim Minlenght As Integer = 1
Dim Maxlenght As Integer = 65536
Regex.IsMatch(sInput,"(^\d{0},{1}$)", "{" + Minlenght, Maxlenght + "}")
^((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{0,5})|([0][0-9]{1,4})|([0-9]{1,4}))$
Junitで上記の正規表現をテストしました。0から65535までのforループを実行します。
例:00001--65535先行ゼロあり1-65535先行ゼロなし例:====
(6553[0-5])
:65530-65535(655[0-2][0-9])
:65500-65529(65[0-4][0-9]{2})
:65000-65499(6[0-4][0-9]{3})
:60000-64999([1-5][0-9]{4})
:10000-59999([0-5]{0,5})
:00000-55555(先行ゼロの場合)([0][0-9]{1,4})
:00000-09999(先行ゼロの場合)([0-9]{1,4})
:0000-9999(先行ゼロの場合)
変数が1〜65536(両端を含む)の整数の場合、...
if [[ "$port" =~ ^[0-9]+$ && $port -ge 1 && $port -le 65536 ]]; then