Дата синтаксического анализа REGEX - сделать регулярное выражение более жадным [дублировать]

1

Я хочу соответствовать 13/12/2015 (день, месяц, год в отдельности):

ASTA n° 30 | 13/12/2015 ore 10.00 | Arte Moderna & Contemporanea

С помощью этого Regex (PHP - preg_match):

/(\d{1,2})\D{1,4}(\d{1,2})\D{1,4}(\d{4}|\d{2})/imu

Я получил:

30 | 13/12

Но мне нужно 13/12/2015. Кажется, что Regex недостаточно жаден... Я знаю, что совпадение, которое я получил, возможно с моим Regex, но я хочу предпочесть \d {4} over\d {2} (в скобке последнего раунда).

EDIT: мне нужно, чтобы элементы \d {2} и \D {1,4} были более гибкими (есть такие даты, как 13.10.15 или 13.12.2015 и т.д.). Есть ли способ изменить порядок обработки двигателя регулярных выражений (от начала до конца)? Итак, он сначала будет соответствовать \d {4}, а затем \d {2} (месяц и день)?

  • 0
    общий подход заключается в извлечении даты с использованием регулярных выражений, без проверки, является ли дата действительной или нет, затем проверяет ее правильными методами, это гораздо более надежно, особенно регулярное выражение не проверяет многие аспекты, такие как 29.02: P
  • 0
    да, я знаю;) я проверяю по 40 различным языкам и 30 различным шаблонам размещения (например, 2015-20-10, 2 декабря 2015, 2. 3. и 4. сентябрь 2015 и т. д.). Мои правила пытаются извлечь дату, которая затем проверяется с помощью анализа класса DateTime ...
Теги:
date
parsing
greedy

2 ответа

1
Лучший ответ

Почему бы просто не просто: \d{2}\/\d{2}\/\d{4} (нажмите regex для демонстрации).

У вас есть цифры, косая черта, две цифры, снова косая черта и 4 цифры.

Если вы хотите добавить поддержку для одиночных цифр и, например, дефисы, вы можете сделать это: \d{1,2}[\ / -]\d{1,2}[\ / -]\d{4} (опять же, нажмите regex для демонстрации).

Обновляется в соответствии с запросом OP, который также соответствует двухзначному году:

(\d{1,2}[\ / -]\d{1,2}[\ / -](?:\d{4}|\d{2})) DEMO

Это регулярное выражение добавляет чек, если он не может найти 4-значный год, он будет искать только 2 цифры.

Редактирование 2: я немного сократил регулярное выражение - теперь дата и месяц находятся в одной группе неперехватных регулярных выражений, но будут совпадать только в том случае, если в этом регулярном выражении есть два случая. С дальнейшим ado регулярное выражение:

((?:\d{1,2}[\ / -]){2}(?:\d{4}|\d{2})) ДЕМО

  • 0
    Иногда встречается дата, в которой год содержит только две цифры ... Которые также должны совпадать ... Что-то вроде 13.10.15 ... Но если год имеет 4 цифры, этот случай следует отдать предпочтение.
  • 0
    @mfuesslin Я обновил свой ответ, чтобы он соответствовал также 2-значным годам. Не забудьте отметить принятый ответ, если он отвечает вашей проблеме.
Показать ещё 2 комментария
0

использование

(\ D {1,2}) \/(\ d {1,2}) \/(\ d {4} |\д {2})

  • 0
    \ D соответствует любому не цифру, которая вызывает проблемы
  • 0
    Почему 1-4 слеша?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню