Это полностью ленивая, низкая накладная, однофункциональная реализация пакета, которая не делает никакого накопления. Основываясь на (и исправляет проблемы) в решении Ника Уэйли с помощью EricRoller.
Итерация происходит непосредственно из основного IEnumerable, поэтому элементы должны быть перечислены в строгом порядке и не доступны больше чем единожды. Если некоторые элементы не потребляются во внутреннем цикле, они отбрасываются (и попытка получить к ним доступ через сохраненный итератор будет бросать InvalidOperationException: Enumeration already finished.
).
Вы можете протестировать полный образец в .NET Fiddle .
public static class BatchLinq
{
public static IEnumerable> Batch(this IEnumerable source, int size)
{
if (size <= 0)
throw new ArgumentOutOfRangeException("size", "Must be greater than zero.");
using (var enumerator = source.GetEnumerator())
while (enumerator.MoveNext())
{
int i = 0;
// Batch is a local function closing over `i` and `enumerator` that
// executes the inner batch enumeration
IEnumerable Batch()
{
do yield return enumerator.Current;
while (++i < size && enumerator.MoveNext());
}
yield return Batch();
while (++i < size && enumerator.MoveNext()); // discard skipped items
}
}
}
Используя регулярные выражения , вероятно, лучший способ. Вы видите, что набор тестов здесь (взятый от хром )
function validateEmail(email) {
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(String(email).toLowerCase());
}
Вот является примером регулярного выражения, которое принимает unicode:
var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
, Но имеют в виду, что не нужно полагаться только на проверку JavaScript. JavaScript может легко быть отключен. Это должно быть проверено на стороне сервера также.
Вот пример вышеупомянутого в действии:
function validateEmail(email) {
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
}
function validate() {
var $result = $("#result");
var email = $("#email").val();
$result.text("");
if (validateEmail(email)) {
$result.text(email + " is valid :)");
$result.css("color", "green");
} else {
$result.text(email + " is not valid :(");
$result.css("color", "red");
}
return false;
}
$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
<p>Enter an email address:</p>
<input id='email'>
<button type='submit' id='validate'>Validate!</button>
</form>
<h2 id='result'></h2>
Ничего себе, существует большая сложность здесь. Если бы все, что Вы хотите сделать, просто поймать самые очевидные синтаксические ошибки, я сделал бы что-то вроде этого:
^\S+@\S+$
Это обычно фиксирует самые очевидные ошибки, которые пользователь совершает и гарантирует, что форма является главным образом правильной, который является тем, о чем проверка JavaScript - все.
JavaScript может соответствовать регулярному выражению:
emailAddress.match( / some_regex /);
Вот регулярное выражение RFC22 для электронных писем:
^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
Это было украдено из http://codesnippets.joyent.com/posts/show/1917
email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
// Yay! valid
return true;
}
else
{return false;}
Трудно получить валидатор электронной почты на 100% правильно. Единственный реальный способ исправить это - отправить тестовое электронное письмо на аккаунт. Тем не менее, есть несколько основных проверок, которые могут помочь убедиться, что вы получаете что-то разумное.
Некоторые вещи, которые нужно улучшить:
Вместо нового RegExp
, просто попробуйте написать regexp
следующим образом:
if (reg.test(/@/))
Во-вторых, убедитесь, что точка стоит после знака @
, и убедитесь, что между @
s есть символы и периоды.
Есть кое-что, что вы должны понять, как только вы решите использовать регулярное выражение для проверки писем: Это вероятно, не очень хорошая идея . Как только вы с этим согласитесь, есть много реализаций, которые помогут вам на полпути, эта статья хорошо их подытоживает.
Короче говоря, единственный способ быть абсолютно уверенным в том, что В действительности пользователь ввел электронное письмо, чтобы отправить электронное письмо и посмотреть, что произойдет. Кроме того, это всего лишь догадки.
Для полноты картины у вас есть другое регулярное выражение, совместимое с RFC 2822
Официальный стандарт известен как 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])?
Еще одно изменение, которое вы можете сделать, - разрешить любое двухбуквенное начало кода страны level и только определенные общие домены верхнего уровня. Это регулярное выражение фильтрует фиктивные адреса электронной почты, например
asdf@adsf.adsf
. Вам потребуется обновить его по мере добавления новых доменов верхнего уровня .
[a-z0-9! # $% & '* + / =? ^ _ `{|} ~ -] + (?: \. [A-z0-9! # $% &' * + / =? ^ _ `{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \ .) + (?: [AZ] {2} | com | org | net | gov | mil | biz | info | mobi | name | aero | jobs | museum) \ b
Таким образом, даже при соблюдении официальных стандартов предстоит еще пойти на компромисс. Не копируйте слепо регулярные выражения из онлайн-библиотек или дискуссионных форумов. Всегда проверяйте их на своих данных и в своих приложениях.
Акцент мой
Вот очень хорошее обсуждение использования регулярных выражений для проверки адресов электронной почты; « Сравнение адресов электронной почты с проверкой регулярных выражений »
Вот текущее верхнее выражение, совместимое с JavaScript, для справки:
/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i
Я добавляю свой Regex - я решил для меня больше небольших проблем как символы с других языков или прописных букв
^[a-zA-Z0-9][a-zA-Z0-9-_\.]+@([a-zA-Z]|[a-zA-Z0-9]?[a-zA-Z0-9-]+[a-zA-Z0-9])\.[a-zA-Z0-9]{2,10}(?:\.[a-zA-Z]{2,10})?$
Используйте браузер/время выполнения, чтобы обработать парсинг входа путем предварительного ожидания протокола и передать его URL
API, захвата любых ошибок и проверить получающееся username
и hostname
свойства результата. Это обработает в основном все преобразования и возможности ( punycode наборов символов, и т.д.). Это только устанавливает, что вход parsable, не, который допустим - который только возможен посредством проверки, если целевая машина получает сообщения для того псевдонима. Это обеспечивает завершение (imo разумный) предположение, хотя, и может быть расширен, чтобы быть более конкретным и реалистичным, если Вы удобны и поддерживающие его и также риск недопустимыми отклонениями. (Обратите внимание, что это не пытается обратиться к IPv4 или адресам IPv6, просто широкий диапазон стоящих с клиентом сценариев с помощью домена.)
function validEmail(email=''){
var [110], url, isValid = false, emailPatternInput = /^[^@]{1,64}@[^@]{4,253}$/, emailPatternUrl = /^[^@]{1,64}@[a-z][a-z0-9\.-]{3,252}$/i;
email = email.trim();
try{
url = new URL('http://'+email);
[110] = `${url.username}@${url.hostname}`;
isValid = emailPatternInput.test( email );
if(!isValid) throw 'invalid email pattern on input:' + email;
isValid = emailPatternUrl.test( [110] );
if(!isValid) throw 'invalid email pattern on url:' + [110];
console.log(`email looks legit "${email}" checking url-parts: "${[110] === email ? '-SAME-':[110]}"`);
}catch(err){
console.error(`probably not an email address: "${email}"`, err);
};
return isValid;
}
['user+this@はじめよう.みんな', 'stuff@things', 'user+that@host.com', 'Jean+François@anydomain.museum','هيا@יאללה', '试@例子.测试.مثال.آزمایشی', 'not@@really', 'no'].forEach(email=>console.log(validEmail(email), email));
Это является и самым простым и большая часть обычно разрешающего примера, который я могу придумать. Отредактируйте его в случаях, где это может быть сделано быть более точным, в то время как поддерживают его простоту и разумную обычно разрешающую законность.
Также см. документы URL MDN URL, окно. URL и Nodejs для URL API.
Можно попробовать RegExp
function isValidEmail( value ) {
return /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,5}$/.test( value );
}
console.log( isValidEmail("mymail@mydomain.com") )
Следующее регулярное выражение:
/^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,3}){1,2}$/;