Я хочу выбрать все форматы для даты и времени, и мне нужно полное регулярное выражение. в настоящее время я использую это регулярное выражение:
public const string DateTimeRegex = @"\b(?<datetime>" +
// Date part
@"((" +
@"(\d{1,2}[/\-\.]\d{1,2}[/\-\.]\d{2}(\d{2})?)" +
@"|(\d{1,2}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*,?\s+\d{2}\d{2}?)" +
@"|((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*\s+\d{1,2},?\s+\d{2}\d{2}?)" +
@"|(\d{4}\-\d{1,2}-\d{1,2})" +
@")" +
// Optional time part
@"(" +
@"[T\s]?\d{1,2}:\d{1,2}(:\d{1,2}(\.\d+)?)?(([AP]M)|([\+\-][12]?\d:\d{1,2})|Z)?" +
@")?)" +
@")\b";
У меня есть небольшая проблема с этим регулярным выражением, оно правильно выбирает все даты в следующем формате, но не может выбрать время (выбраны только некоторые)
11/17/2022 11:36 AM
1/6/2023 6:19 PM
11/3/2022 12:06 PM
Saturday, December 10, 2022 8:07 AM
Thursday, January 5, 2023 3:27 AM
Выход:
11/17/2022
1/6/2023
11/3/2022
December 10, 2022
January 5, 2023
Поэтому мне нужно использовать другое регулярное выражение для выбора части времени
public const string DateTimeRegex2 = @"(\d{1,2}:\d{1,2}(:\d{1,2}(\.\d+)?)?(([AP]M)|([\+\-][12]?\d:\d{1,2})|Z)?)";
Я попытался объединить эти 2 регулярных выражения, но, к сожалению, это не работает, а дата и время выбраны неправильно.
Теперь у меня есть дата, как это:
25-Dec-2022 12:36
И ни одно из регулярных выражений не может его выбрать.
Поэтому мне нужно регулярное выражение, которое выбирает следующие форматы:
25-Dec-2022
25-Dec-2022 12:36
25-Dec-2022 12:36 PM
11/17/2022
11/17/2022 12:36
11/17/2022 12:36 PM
1/6/2023
1/6/2023 12:36
1/6/2023 12:36 PM
11/3/2022
11/3/2022 12:36
11/3/2022 12:36 PM
December 10, 2022
December 10, 2022 12:36
December 10, 2022 12:36 PM
January 5, 2023
January 5, 2023 12:36
January 5, 2023 12:36 PM
Если доступны какие-либо другие форматы, мне нужно их идентифицировать
@depperm tnx поддерживает не все мои форматы, а только некоторые
Существует так много других возможных форматов. Как насчет January 5th, 2023 или 05. März 2023 и т. д. и т. д.
О, ты понятия не имеешь, какую банку с червями пытаешься открыть.
Также: 1/6 января 6 или 1 июня? Потому что в зависимости от того, откуда вы родом, вы будете отвечать по-разному, и вас, вероятно, удивит, насколько большая часть мира не согласна с вами, независимо от того, к какому формату вы привыкли, даже в вашей собственной стране.
Когда дело доходит до этого, вы не должны позволять пользователям вводить произвольные строки для даты/времени. Заставьте их использовать средство выбора календаря или подобное. Если вы должны разрешить им вводить произвольные строки, всегда предоставляйте немедленную и недвусмысленную обратную связь о том, как интерпретируется значение, а затем сохраняйте интерпретируемое значение только в однозначном и согласованном формате.
Наконец, даже если вы каким-то образом преуспеете в этом, результирующее выражение будет непоправимым кошмаром для обновления с течением времени. В данном случае Regex просто не подходит для этой работы.
Как насчет следующего регулярного выражения?
(?<date>(?:\d{1,2}/\d{1,2}/\d{4}|\d{1,2}-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\d{4}|(?:January|February|March|April|May|June|Jule|August|September|October|November|December) \d{1,2}, \d{4}))(?:\s+(?<time>\d{1,2}:\d{1,2}(?: (?:AM|PM))?))?
Tnx, между датой и временем у нас 2 пробела, как я могу это исправить?
Обновлено для нескольких пробелов между датой и временем