4

今のところ、私はこの正規表現を使用しています:

^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$

あまり良くないと思います。では、jid を検証するための最適な正規表現は何ですか?

参考までに、XMPP コア標準のセクション 3では、Augmented Backus-Naur Form の JID を次のように定義しています。

jid             = [ node "@" ] domain [ "/" resource ]
domain          = fqdn / address-literal
fqdn            = (sub-domain 1*("." sub-domain))
sub-domain      = (internationalized domain label)
address-literal = IPv4address / IPv6address
4

3 に答える 3

7

これを試して:

^(?:([^@/<>'\"]+)@)?([^@/<>'\"]+)(?:/([^<>'\"]*))?$

特にドメイン名の部分では、有効な JID ではないものに一致するものがたくさんあるため、これは正しくありませんただし、グループ 1 をノード、グループ 2 をドメイン、グループ 3 をリソースとして、すべての有効なJIDを許可して解析する必要があります。


テストデータ:

foo                 (None,  'foo', None)
foo@example.com     ('foo', 'example.com', None)
foo@example.com/bar ('foo', 'example.com', 'bar')
example.com/bar     (None,  'example.com', 'bar')
example.com/bar@baz (None,  'example.com', 'bar@baz')
example.com/bar/baz (None,  'example.com', 'bar/baz')
bär@exämple.com/bäz ('bär', 'exämple.com', 'bäz')

余談ですが、構文 (?:) に慣れていない場合は、出力にグループを追加しないかっこのセットです。

于 2009-09-10T16:04:23.293 に答える
6

あなたの正規表現は、少なくとも次の点で間違っています:

  1. 「@」を含まない jid も有効な場合がありますが、「@」を含む jid が必要です。
  2. 最大長をチェックしません(ただし、提供したリンクには、「JIDの各許容部分の長さは1023バイトを超えてはなりません」と書かれています)

巨大な正規表現を 1 つ持つのは間違った方法だと思います。jid を小さな部分 (ドメイン、ノード、リソース) に分割してから、それらの各部分をチェックするコードをさらに作成することをお勧めします。それは複数の点からより良いでしょう:

  • 簡単なテスト (各パーツを個別に単体テストできます)
  • よりよい性能
  • よりシンプルなコード
  • 再利用性
于 2009-08-31T11:36:48.700 に答える