2014-01-16 3 views
2

Я использую следующее регулярное выражение для проверки по электронной почте:C# регулярное выражение не работает в Javascript

^[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; 
} 

Это возвращает ложь для простого "[email protected]" адрес электронной почты.

Заранее благодарен!

Кевин

+0

Ускорение обратного слэша означает, что вы соответствуете буквальному '' '... JS regex's очень похожи на регулярное выражение PCRE, но немного _easier_. Вы не должны проверять адреса электронной почты с помощью регулярных выражений. Этого не может быть сделано ... никому не удалось проверить действительные адреса электронной почты с помощью одного регулярного выражения ... О, и почему вы используете XRegExp, а не простое регулярное выражение? –

+0

Как еще вы считаете, я проверяю формат электронной почты на стороне клиента? –

+0

У вас нет. Вы _can_ выполните некоторую базовую проверку (например: содержит ли вход знак '@'), но выполняется проверка данных _server-side_ –

ответ

2

Проблема заключается в том, что регулярное выражение содержит character class subtractions. JavaScript RegExp не поддерживает их, также как и XRegExp. (. Я изначально misremembered и отметил, что он делает, но это не делает)

Однако вычитания класса символов могут быть заменены с отрицательным lookaheads так это:

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

может стать следующим образом:

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

Оба означают «любой символ слова, но не один в наборе '&_]». Выражение \w не соответствует ', & или ] таким образом, мы можем упростить:

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

Или так \w является [A-Za-z0-9_], мы можем просто удалить подчеркивание из списка и далее упрощать:

[A-Za-z0-9] 

Итак, окончательный вариант RegExp:

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]+)*))(\\]?)$") 

У меня есть e скромное тестирование с помощью этого RegExp, но вы должны сделать должную осмотрительность при проверке.

Нет необходимости проходить через отрицательный контрольный шаг, чтобы упростить регулярное выражение, но зная, что вычитания классов символов могут быть заменены на негативные образы, полезно в более общих случаях, когда ручное упрощение было бы трудным или хрупким.

+0

Ничего себе, какой хороший ответ. Как долго вы смотрите на регулярные выражения? – Joe

+0

Я использовал регулярные выражения в течение многих лет. – Louis

+0

Я использую регулярное выражение также в течение длительного времени, но я никогда не использовал эту функцию самостоятельно. Я слышал, но я не видел, чтобы это редко строилось здесь в этом вопросе. +1. – stema

Смежные вопросы