2

次の正規表現を使用して電子メールを検証しています。

^[a-zA-Z0-9!$'*+/\-_#%?^`&=~}{|]+(\.[a-zA-Z0-9!$'*+/\-_#%?^`&=~}{|]+)*@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-['&_\]]]+)(\.[\w-['&_\]]]+)*))(\]?)$

これは C# では正常に動作しますが、JavaScript では動作しません.... はい、次のようにすべてのバックスラッシュを二重のバックスラッシュに置き換えました。

^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-['&_\\]]]+)(\\.[\\w-['&_\\]]]+)*))(\\]?)$

XRegExp を使用しています。ここで何か不足していますか?おそらく通常の正規表現をJavaScriptに変換するコンバーターのようなものはありますか:)?

これが私の機能です:

 function CheckEmailAddress(email) {
     var reg = new XRegExp("^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-['&_\\]]]+)(\\.[\\w-['&_\\]]]+)*))(\\]?)$")

     if (reg.test(email) == false) {
         return false;
     }

     return true;
 }

単純な「abc@123.com」メール アドレスに対して false を返しています。

前もって感謝します!

ケビン

4

1 に答える 1

2

問題は、正規表現に文字クラスの減算が含まれていることです。JavaScriptRegExpはそれらをサポートしていませんXRegExp。(私は最初にそれがあると誤解してコメントしましたが、そうではありません。)

ただし、文字クラスの減算は否定的な先読みに置き換えることができるため、次のようになります。

[\w-['&_\\]]]

これになることができます:

(?:(?!['&_\\]])\\w)

どちらも「セット内の単語文字ではなく、任意の単語文字」を意味し'&_]ます。式は と一致しないため、次のよう\wに単純化できます。'&]

(?:(?!_)\\w)

または、\wis[A-Za-z0-9_]であるため、リストからアンダースコアを削除して、さらに単純化できます。

[A-Za-z0-9]

したがって、最終的な正規表現は次のとおりです。

new RegExp("^[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+(\\.[a-zA-Z0-9!$'*+/\\-_#%?^`&=~}{|]+)*@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([A-Za-z0-9]+)(\\.[A-Za-z0-9]+)*))(\\]?)$")

私はこの RegExp を使ってささやかなテストを行いましたが、チェックする際には十分な注意を払う必要があります。

正規表現を単純化するために否定先読みステップを実行することは厳密には必要ではありませんが、文字クラスの減算を否定先読みで置き換えることができることを知っておくと、手動による単純化が困難または脆弱な場合に役立ちます。

于 2014-02-01T13:12:03.530 に答える