Полное регулярное выражение для выбора даты и времени

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

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

Если доступны какие-либо другие форматы, мне нужно их идентифицировать

ihateregex.io/expr/date
depperm 10.01.2023 19:46

@depperm tnx поддерживает не все мои форматы, а только некоторые

Mahdi 10.01.2023 19:50

Существует так много других возможных форматов. Как насчет January 5th, 2023 или 05. März 2023 и т. д. и т. д.

Klaus Gütter 10.01.2023 20:39

О, ты понятия не имеешь, какую банку с червями пытаешься открыть.

Joel Coehoorn 10.01.2023 20:47

Также: 1/6 января 6 или 1 июня? Потому что в зависимости от того, откуда вы родом, вы будете отвечать по-разному, и вас, вероятно, удивит, насколько большая часть мира не согласна с вами, независимо от того, к какому формату вы привыкли, даже в вашей собственной стране.

Joel Coehoorn 10.01.2023 20:49

Когда дело доходит до этого, вы не должны позволять пользователям вводить произвольные строки для даты/времени. Заставьте их использовать средство выбора календаря или подобное. Если вы должны разрешить им вводить произвольные строки, всегда предоставляйте немедленную и недвусмысленную обратную связь о том, как интерпретируется значение, а затем сохраняйте интерпретируемое значение только в однозначном и согласованном формате.

Joel Coehoorn 10.01.2023 20:52

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

Joel Coehoorn 10.01.2023 20:53
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
1
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет следующего регулярного выражения?

(?<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 пробела, как я могу это исправить?

Mahdi 11.01.2023 07:07

Обновлено для нескольких пробелов между датой и временем

Mike Mozhaev 11.01.2023 08:19

Другие вопросы по теме

Регулярное выражение для фильтрации массива строк, исключая те, которые начинаются с '.'
Как сопоставить только определенные символы в заданной строке с регулярным выражением?
Установите условие внутри лямбда-функции в зависимости от того, является ли значение, захваченное с помощью регулярного выражения, None или ""
Переименование нескольких файлов в каталоге с использованием определенной строки в каждом файле
Извлечь первый символ всех слов, кроме первого
Разбор дат в другом формате из текста
Мне нужно регулярное выражение, чтобы аннулировать все одинаковые цифры в номере телефона
Использование регулярных выражений для извлечения определенной информации через PyPDF2
Установите регулярное выражение с множественным выбором, чтобы попытки сопоставления всегда выполнялись слева направо, независимо от того, пытается ли другое предыдущее регулярное выражение захватить больше символов?
Сравнение значений из двух списков с помощью регулярных выражений в Kotlin