Для такой ситуации |
оператор означает или полезен, для второго примера вы можете изменить выражение на:
'([(\d\.)]+|[a-z\d\.]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
Обратите внимание, что это предполагает, что все адреса состоят только из строчных букв, цифр и точек , РЕДАКТИРОВАТЬ: После комментария @tripleee
я должен признать, что адреса могут содержать больше разных символов, поэтому я добавлю более терпимое решение:
'([(\d\.)]+|[^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
этот предполагает, что адрес может содержать любой символ, который не является пробелом. Если это слишком терпимо, не стесняйтесь улучшать более раннюю версию. Как отмечено в комментариях, он является избыточным и может быть заменен на
'([^ ]+) - - \[(.*?)\] "(.*?)" (\d+) (\d+)'
. Чтобы заставить его работать с последним случаем, просто замените последний (\d+)
на (\d+|-)
, как это было предложено в @solarc
ранее
Я читал о MVC, MVP и Унижаю Диалоговое окно. (я вытягивал волосы). Коллега, который упомянул уровень UI, не смог дать мне очень хороший пример того, как он отличается от бизнес-слоя. И при выяснении он сказал, что это не был MVC/MVP. Следовательно я думал, что расспрошу тут и там
Я нашел серию Build Your Own CAB Jeremy Miller статей очень информативной в прошлом. Он описывает много вариаций на семейство Образцовых Контроллеров Представления шаблонов. Это - превосходное чтение.
Здесь существует несколько опций.
MVC
Необходимо разделить Представление далеко от Модели и Контроллера. Самый легкий способ вообразить, почему Вы сделали бы это, состоит в том, если у Вас были та же Модель и Контроллер, что Вы хотели представить различные взгляды - представление веб-сайта, представление автономного приложения, представление веб-сервиса, представление мобильного телефона, Ваши представления модульного теста, и т.д. Поэтому Вы не хотите логики в своем коде представления. Т.е. в Java, никаком образцовом управлении в Вашем ActionListeners и другом коде GUI - вместо этого Вы выгоняете это с квартиры в класс контроллера, и обработчик Представлений просто делает контроль ввода, выходное форматирование, и говорит с классом контроллера.
Много представлений записаны из центрального представлением подхода. У Вас есть свой GUI. Что-то происходит, и Вы реагируете на это и действительно наполняете и обновляете GUI по мере необходимости. Поэтому легко связать Вашу бизнес-логику и модель очень плотно в представление.
В основном Вы создаете интерфейс (интерфейсы) в свою бизнес-логику, которую что-либо может назвать, таким образом добавление, что новые представления просты. Те интерфейсы обеспечивают все функции, которые необходимо вызвать. Можно затем сделать внутреннюю бизнес-логику частной.
Веб-форма сбора данных (или серия веб-форм)
Очень маловероятно, что Вы захотите собрать информацию в том же порядке как Ваша модель данных в Вашем бизнес-слое. Кроме того, необходимо будет сохраниться между страницами в многостраничной форме. Вы быстро найдете, что они не пустыми ограничениями является ЛАВАШ при сборе их на странице 3 (потому что они отталкивают клиентов на странице 1). Поскольку формы склонны измениться, поскольку они перестроены, Вы закончите тем, что разделили бизнес-логику от представления довольно вначале и сделали вывод, как Вы заполняете свою модель. И много другого материала.
Интерфейс, который сгенерирован из модели
У Вас есть модель, которая может измениться или действительно описывает интерфейс или явно или неявно. Вы поэтому генерируете интерфейс из модели вместо того, чтобы использовать предварительно разработанные формы и окна и так далее. Таким образом, необходимо программировать код представления вполне в общем, поскольку у Вас только будет модель для работы от. Много карт от модели до UI и наоборот. Затем Вы добавляете в некоторых наблюдателях, потому что модель оценивает изменение в другом месте, и это - отличное развлечение... :)
Что-то еще...
В самых простых терминах Ваш уровень UI только интересуется UI, и сотрудничающий со следующим уравнивают (Ваш бизнес-слой возможно). Ваш бизнес-слой и слой данных (и любые другие слои Вы имеете) никогда не должны иметь никакого кода UI в них, потому что это - задание уровней UI.
Думайте о способе, которым работает веб-браузер, браузер является уровнем UI и интересуется рендерингом Вашей страницы и ничего иного. Когда что-то должно произойти, это звонит веб-серверу (следующий слой), чтобы сделать это и затем представляет результаты.
Попытайтесь гуглить для некоторых известных шаблонов UI:
Вот мой принцип: если необходимо переписать какую-либо логику (кроме управления средствами управления формой), то Вы не полностью разделили уровень UI от своих других слоев. Лично, мне нравится иметь Уровень служб, который содержит мои бизнес-правила, управляя доменом и объектами datamapping, и только обмениваясь объектами области с UI. UI ничего не знает о datamapping затем, или о бизнес-правилах.
Это не отвечает об отдельном "уровне UI" между UI и моим Уровнем служб. Возможно, это с точки зрения разделения HTML и кода (т.е. код ASP.Net behinds можно было бы считать уровнем UI). Нет ничего худшего (в изменении/отладке веб-приложений), чем необходимость изменить глобальные настройки HTML, когда разметка создается по частям в тысяче различных функций. HTML должен просто быть в файлах HTML с минимальным количеством сценариев, необходимых для связи их с классами.