0

重複の可能性:
正規表現を使用してメールアドレスを検証する

これは宿題です。私はしばらくの間それに取り組んできました。たくさんの読書をして、初心者のために正規表現にかなり慣れてきたと感じています。

メールのリストを検証/無効化するための正規表現を見つけようとしています。問題を引き起こしているアドレスが2つありますが、両方を同時に正しい方法で検証することはできません。リストにある他のすべての電子メールで機能する12の異なる式を実行しましたが、これら2つを同時に取得することはできません。

まず、アドレス。

me@example..com  - invalid
someone.nothere@1.0.0.127  - valid

接尾辞を検証する私の式の部分

私はもともと

@.+\\.[[a-z]0-9]+

そして、さらにいくつかの無効なアドレスをチェックし、両方のパターンに対して電子メールをチェックするための2番目のパターンがあり、一方は有効性をチェックし、もう一方は無効性をチェックしましたが、私の教授はそれをすべて表現したいと言いました。

@[[\\w]+\\.[\\w]+]+

また

@[\\w]+\\.[\\w]+

私はそれを多くの異なる方法で書いてみましたが、私はこれらの2つの式を表現するために異なる構文を使用していたと確信しています。

私はそれが何をしたいのかを知っています、私はそれを「character+」の文字クラスに一致させたいです。「character+」+

プラス記号は少なくとも1つです。無効なクラスでは、文字クラスを1回だけ繰り返すことを許可すると(明らかにIPが一致しません)、文字クラスを繰り返すことを許可すると、そうでない場合でも2番目の期間と一致します。文字が前に付きます。理由がわかりません。

すべてを()でグループ化し、エスケープした後に{1}を付けてみました。\ wをazに変更し、+を{1、}に置き換えます。文字で囲まれるのにピリオドは必要ないようです。

4

4 に答える 4

0

私はあなたがこれを望んでいると思います:

@[\\w]+(\\.[\\w]+)+

これは、「単語」の後に1つ以上の「。」が続く場合に一致します。「単語」シーケンス。(逆にグループ化することもできます。たとえば、Dailinの回答を参照してください。)

以前に行っていたことの問題は、キャラクタークラス内にリピートを埋め込もうとしていたことでした。それは意味がなく、それをサポートする構文はありません。文字クラスは文字のセットを定義し、1つの文字と照合します。これ以上何もない。

于 2012-10-17T23:19:09.057 に答える
0

公式の標準RFC 2822 では、次の正規表現で有効な電子メール アドレスの構文について説明しています。

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

RFC 2822 のより実用的な実装 (二重引用符と角括弧を使用した構文を省略した場合) は、現在でも実際に使用されているすべての電子メール アドレスの 99.99% に一致します。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
于 2012-10-18T00:09:24.807 に答える
0

否定的な先読みが必要です:

@\w+\.(?!\.)

http://www.regular-expressions.info/lookaround.htmlを参照してください。

Perl でのテスト:

Perl> $_ = 'someone.nothere@1.0.0.127'
someone.nothere@1.0.0.127

Perl> print "OK\n" if /\@\w+\.(?!\.)/
OK
1

Perl> $_ = 'me@example..com'
me@example..com

Perl> print "OK\n" if /\@\w+\.(?!\.)/

Perl> 
于 2012-10-17T22:58:46.497 に答える
0
@([\\w]+\\.)+[\\w]+

少なくとも 1 つの単語文字に一致し、その後に「.」が続きます。これが少なくとも 1 回繰り返され、その後に少なくとも 1 つの単語文字が続きます。

于 2012-10-17T23:18:45.020 に答える