あなたの正規表現は、あなた、またはすでに他のブロックに含まれているもので少し冗長です。
私はあなたがしなければならなかったことを単純化しました
(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5}
そしてそれはうまく動作します...
\ がホスト名で許可されていないことは確かなので、許可された文字に \ が含まれている理由はわかりません。
あなたの問題は、あなたのまたは | このように物事を分解します...
[A-Za-z0-9\\-]+
また
[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}\\.[A-Za-z0-9]{1,3}
また
\*
コメンターが言ったように、2番目のブロックに「-」が含まれていませんでした。
だからおそらくあなたは意図した
^((?:[A-Za-z0-9\\-]+|[A-Za-z0-9]{1,3})\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}\.[A-Za-z0-9]{1,3}):([0-9]{1,5}|\*)$
ただし、+ には {1-3} が含まれているため、最初から 2 つの or で囲まれた項目は冗長になります。
すなわち。[A-Za-z0-9\-]+ は、これが [A-Za-z0-9]{1,3} に一致するものすべてに一致します
このツールを使用して正規表現をテストできます:
http://regexpal.com/
個人的には、すべての開発者がregexbuddyを持つべきだと思います
上記の正規表現は機能しますが、無効なホスト名を許可します。
最初の文字で句読点を許可しないように変更する必要があります。
したがって、このように変更する必要があります。
(?:[A-Za-z0-9][A-Za-z0-9-]+\.)(?:[A-Za-z0-9-]+\.)+[A-Za-z0-9]{1,3}:\d{1,5}
また、理論的には、ホストをハイフンで終わらせることはできません。
それはすべて非常に複雑なので、正規表現を使用して部分をキャプチャし、Uri.CheckHostName を使用して実際に Uri が有効であることを確認します。
または、CodeCaster が提案する正規表現を使用することもできます