RegEx для соответствия конкретному предложению, а также дате и времени

Я попытался выяснить, как заставить регулярное выражение соответствовать чему-то конкретному после даты и времени. Я не могу для жизни меня понять это!

Я хочу сопоставить следующее предложение, где дата и время, конечно, могут быть случайными:

День 25.01.2013 кл. 14.03 скрев

Таким образом, это должно совпадать так: Den dd/mm/yyyy kl. чч.мм скрев

Обратите внимание, что время указано в 24-часовом формате.

Кто-нибудь может здесь помочь? Я могу легко найти пример, который соответствует дате или времени, но я не знаю, как совместить его с этим конкретным предложением :(

заранее спасибо


person nickdnk    schedule 28.01.2013    source источник


Ответы (4)


Используйте его, просто объединив их как:

Den (0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/(0{3}[1-9]|((?!0{3}\d)\d{4})) kl\. ([01][0-9]|[2[0-3])\.([0-5][0-9]) skrev

Примечание. Дата не проверена должным образом. Будет матч 30.02.2000

Den соответствует Den как таковому.

(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\d{3}[1-9] соответствует дате. 0{3}[1-9]|((?!0{3}\d)\d{4}) избегает 0000 в качестве года.

kl\. соответствует kl. \ перед . означает экранирование ., который является специальным символом в регулярном выражении.

([01][0-9]|[2[0-3])\.([0-5][0-9]) соответствует времени с 00.00 по 23.59

skrev соответствует skrev как таковому.

Следующее проверяет дату немного лучше

Den ((0[1-9]|[12][0-9]|3[01])/(?=(0[13578]|1[02]))(0[13578]|1[02])|(0[1-9]|[12][0-9]|30)/(?=(0[469]|11))(0[469]|11)|(0[1-9]|[12][0-9])/(?=(02))(02))/(0{3}[1-9]|((?!0{3}\d)\d{4})) kl\. ([01][0-9]|[2[0-3])\.([0-5][0-9]) skrev

Все еще соответствует 29/02/1999 — високосный год не проверяется

Чтобы сопоставить дни и месяцы из одной цифры, замените часть даты следующим:

(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/(0{3}[1-9]|((?!0{3}\d)\d{4}))

? делает предыдущую часть необязательной, то есть 0 становится необязательной.

person Naveed S    schedule 28.01.2013
comment
Хотя я не могу заставить его проверяться на regexpal.com, если я ввожу предложение Den 4/12/2012 кл. 14:41 скрев например. - person nickdnk; 28.01.2013
comment
И меня не волнует високосный год или 0000, февраль и т. д. Это только для того, чтобы поймать сгенерированные даты, а не проверять их или что-то еще. Это нужно для того, чтобы поймать заголовок ответа в электронном письме. - person nickdnk; 28.01.2013
comment
@nickdnk Думаю Ден 04.12.2012 кл. 14:41 skrev неверный ввод, не так ли? - person Naveed S; 28.01.2013
comment
Ой, простите. Он работает на regextester.com. Может быть, другой сайт просто сломан. Ответ принят. - person nickdnk; 28.01.2013
comment
Он должен быть в состоянии соответствовать однозначным месяцам! - person nickdnk; 28.01.2013
comment
@nickdnk Ответ отредактирован, чтобы разрешить однозначное число дня и месяца. - person Naveed S; 28.01.2013

`Den ([0-3]\d)/([0-1]\d)/(\d{4}) kl\. ([0-2]\d)\.([0-5]\d) skrev`

чтобы поймать значения, чтобы облегчить проверку.

person Ingo    schedule 28.01.2013
comment
Отредактированный Навидом ответ намного лучше моего, хотя он ближе к полной проверке. мое регулярное выражение позволит, например, 29 часов - person Ingo; 28.01.2013
comment
Я не могу заставить это вообще что-либо проверить ... Разве я не должен ввести полный пример предложения в своем исходном сообщении, и это должно быть поймано, например, на regexpal.com? - person nickdnk; 28.01.2013
comment
Извините, использовал неправильный валидатор :) Но Nava, похоже, на правильном пути. Спасибо, в любом случае. - person nickdnk; 28.01.2013

возможно, не самое умное решение, но это выражение должно соответствовать вашему запросу:

Den\s[0-3][0-9]/[0-1][[0-9]/[0-9][0-9][0-9][0-9]\скл.\ s[0-2][0-9].[0-6][0-9]\sskrev

person Tom Mekken    schedule 28.01.2013

Оказывается, все, что мне действительно было нужно, это:

(ден../../....кл......скрев)

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

Если кому-то интересно, это для фильтрации заголовков ответов SpiceWorks.

person nickdnk    schedule 08.02.2013