Можно попробовать их (не гарантируемый):
UPS:
\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b
UPS:
\b(1Z ?\d\d\d ?\d\w\w ?\d\d ?\d\d\d\d ?\d\d\d ?\d|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b
USPost:
\b(\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d|\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d)\b
, Но протестируйте перед использованием их. Я рекомендую RegexBuddy.
(Все это с точки зрения C #.)
У меня есть статья о различиях между событиями и делегатами . Это охватывает все, что упоминается ниже, более подробно.
В основном мне нравится думать о событии как о свойстве - это пара методов, вот и все. Вместо получения / установки в событии указано «добавить / удалить», что означает «добавить этот обработчик событий» и «удалить этот обработчик событий». По сути, это все, что есть событие.
В C # также есть событий, подобных полю , которые являются ярлыками:
public event EventHandler Foo;
объявляет как поле , так и событие с почти тривиальная реализация добавления / удаления. В классе ссылка на Foo
относится к полю. Вне класса ссылка на Foo
относится к событию.
Основная идея состоит в том, что событие позволяет другому коду подписаться на него и отказаться от подписки, передав делегат (обработчик события ). Обычно подписка реализуется путем создания нового делегата многоадресной рассылки, содержащего предыдущий список обработчиков событий и новый список. Поэтому, если вы храните обработчики событий в поле с именем myEventHandlers
, реализация подписки может быть следующей:
myEventHandlers += value;
Аналогичным образом отмена подписки обычно включает создание нового делегата многоадресной рассылки без указанного обработчика:
myEventHandlers -= value;
Затем, когда вы хотите инициировать / активировать событие, вы просто вызываете этот делегат многоадресной рассылки - обычно с проверкой на недействительность, чтобы избежать генерации исключения, если никто не подписался:
EventHandler handler = myEventHandlers;
if (handler != null)
{
// You could pass in a different "sender" and "args" of course
handler(this, EventArgs.Empty);
}
Используя события, подписчики не знают друг о друге и могут ' t поднимать событие сами (обычно). Другими словами, это шаблон инкапсуляции, которому присвоен статус как в языке, так и в платформе.
Разница проста.
делегат
- это класс с двумя полями - объект и MethodInfo.
событие
- это частное поле типа делегат
и два публичных метода add
и remove
.
Обычно под капотом события используется MulticastDelegate
- это класс, унаследованный от Delegate
и содержащий список делегатов. Это позволяет событию иметь несколько подписчиков.
Вы можете посмотреть: http://msdn.microsoft.com/en-us/library/17sde2xt.aspx
Пример продолжается здесь: http://msdn.microsoft.com/en-us/library/xwbwks95.aspx
В основном, как уже упоминалось, события - это просто особые случаи делегатов, но с изменениями в .NET 3.5 вы можете написать события без использования делегатов, хотя под капотом делегаты все еще пишутся.
Если вы посмотрите эту статью, они показывают, как использовать лямбда-выражения и анонимные функции для событий: http://msdn.microsoft.com/en-us/library/ms366768.aspx
.Net-события - это просто делегаты под капотом: они предоставляют некоторый синтаксический сахар в компиляторе.
Вы можете установить / сбросить делегат, но вы можете только добавить или удалить обработчик событий . Причина в том, что вам все равно, кто еще подписывается на событие, тогда как простые делегаты больше используются в сценарии «обратного вызова».
Но, в конце концов, они очень похожи.
Некоторые ресурсы:
Вам нужно указать, какой язык вы хотите. Насколько мне известно, в Java нет концепции делегатов (хотя я могу ошибаться); он имеет тенденцию следовать шаблону наблюдателя для обработки событий,
C #, однако, делает. Событие
в C # имеет такое же отношение к делегату, как свойство - к своему поддерживающему полю. Сам делегат - это то, что хранит указатель на функцию, которая обрабатывает событие (или, точнее, список указателей, прикрепленных к событию; я использую термин «указатель» здесь вольно).
Если я объявлю это на C # :
public event EventHandler MyEvent;
И вызывайте событие следующим образом:
MyEvent(this, EventArgs.Empty);
На самом деле это просто сокращение для полной реализации события:
private EventHandler myEventHandler;
public event EventHandler MyEvent
{
add { myEventHandler += value; }
remove { myEventHandler -= value; }
}
И вызывая его ...
myEventHandler(this, EventArgs.Empty);
Все это означает, что настоящее событие
предоставляет две операции: add
и remove
, которые используются кодом-потребителем для присоединения своих обработчиков событий к событию. В обозначении по умолчанию (сокращенном) компилятор создает частный экземпляр члена типа делегата и использует его так, как я описал выше. Когда ты "