0
validate_email = ( email ) ->
   (/^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*$/).test email

これは機能しますが、79 文字で「行の最大長」テストに失敗するため、coffeescript.org の例を使用して 80 文字未満 (実際には最大 74 文字) に削減しようとしています。

RFC822 = /// ^ (
  ([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x22([^\x0d\x22\x5c\x80-\xff]
  | \x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x22([^\x0d\x22\x5c\x80-\xff]
  | \x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x5b([^\x0d\x5b-\x5d\x80-\xff]
  | \x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x5b([^\x0d\x5b-\x5d\x80-\xff]
  | \x5c[\x00-\x7f])*\x5d))*$/
) ///
RFC822.test email

これは問題なくコンパイルされますが、機能しません。常に false を返します。

どうすればいいですか?

4

2 に答える 2

3

文字列から構築できます (バックスラッシュをエスケープする場合):

var re = new RegExp(
               "..." + 
               "..." + 
               "...");

( JS の完全なマッチャーの要点、問題なく動作するようですが、私の CF は錆びているため、CF に変換されるかどうかはわかりません)

于 2013-04-12T10:51:46.280 に答える
2

どうすればいいですか?

そうではありません - 正規表現は、電子メール アドレスの解析には適していません。

そのような正規表現は失敗する運命にあります。なぜなら、ドメイン名が通常行うほとんどすべての仮定を破るドメイン名が現在存在するからです。

  • 長い ASCII TLD (TLD が 4 文字より長い場合にバーフする正規表現を見たことがあります)
  • US ASCII を使用しない国際ドメイン (IDN)

とはいえ、インタラクティブな Coffeescript インタープリターを使用して、いくつかの文字を調整するだけで次のようになりました。

RFC822 = ///
^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x22([^\x0d\x22\x5c\x80-\xff]
  | \x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x22([^\x0d\x22\x5c\x80-\xff]
  | \x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x5b([^\x0d\x5b-\x5d\x80-\xff]
  | \x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a
  -\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+
  | \x5b([^\x0d\x5b-\x5d\x80-\xff]
  | \x5c[\x00-\x7f])*\x5d))*$
///

これは元の正規表現に正確に還元されます。唯一の変更は、正規表現全体を囲む余分な中括弧のペアと/、閉じた後の末尾の を削除したこと$です。

于 2013-04-12T10:28:27.353 に答える