2

次の文字列のこれらの部分を一致させる必要があります。

(user)@(hostname):(port)

ユーザーとポートはオプションで一致させることができます。最初に、次の正規表現で管理しました。

(?:([^@]*)@)?([^\:]+)(?:\:(\d+))?

これはfoo@bar:80

foo
bar
80

しかし、のような IPv6 ホストにfoo@[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:80なると、前述の正規表現は期待どおりに機能しません。

foo
[2001
0

だから今、私は、角括弧で囲まれたホストをコロンで囲み、角括弧なしで一致させることができる正規表現について考えています。:)私は次の正規表現でそれを行いました:

(?:([^@]*)@)(?:\[(.+)\]|([^:]+))(?:\:(\d+))?

foo
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
<empty>
80

2しかし..どちらか3が空になるので、これは醜いです。これを 1 つの後方参照に結合する方法はありますか?

私が知る限り、perl の正規表現エンジンを使用する boost::regex を使用しています。

感謝と敬意

再販

4

1 に答える 1

3
(?:([^@]*)@)(\[.+\]|([^:]+))(?:\:(\d+))?

ただし[]、IPv6 アドレスの場合は削除する必要があります。ただし、かなり些細なはずです。

オプション[]前後のアサーションを使用してそれを行うこともできます...しかし、それは本当に醜いです。KISSして上記を使用するだけで、仲間のプログラマーはあなたに感謝しますが、オプションは次のとおりです。

(?:([^@]*)@)\[?((?<=\[).+(?=\])|([^:]+))\]?(?:\:(\d+))?
于 2011-05-29T00:04:27.950 に答える