[Отредактировано (снова) для улучшения форматирования и исправления вступления.]
Это комментарий и ответ.
Часть ответа ... Я согласен с более ранним ответом alex.
(?: )
, в отличие от ( )
, используется, чтобы избежать захвата текста, как правило, для того, чтобы меньшее количество обратных ссылок добавлялось к тем, которые вы хотите, или для повышения быстродействия.
? после (?: )
- или после чего-либо, кроме * + ?
или {}
- означает, что предыдущий элемент может или не может быть найден в рамках законного соответствия. Например, /z34?/
будет соответствовать z3, а также z34, но не будет соответствовать z35 или z и т. Д.
Часть комментариев ... Я сделал то, что могло бы быть улучшением для регулярного выражения, над которым вы работали:
(?:^|\s)(0?[1-9]|[1-2][0-9]|30|31)-(0?[1-9]|10|11|12)-((?:20)?[0-9][0-9])(?:\s|$)
- Во-первых, он избегает таких вещей, как 0-0-2011
- Во-вторых, он избегает таких вещей, как 233443-4-201154564
- В-третьих, оно включает в себя такие вещи, как 1-1-2022
- Далее, это включает в себя такие вещи, как 1-1-11
- В-пятых, он избегает таких вещей, как 34-4-11
- В-шестых, он позволяет вам фиксировать день, месяц и год, чтобы вам было легче ссылаться на них в коде ... коде, который, например, будет выполнять дополнительную проверку (это вторая захваченная группа 2 и является либо первой захваченной группой 29, и это високосный год, либо первая захваченная группа <29), чтобы узнать, подходит ли дата 29 февраля или нет. </p>
Наконец, обратите внимание, что вы все равно получите даты, которых не существует, например, 31-6-11. Если вы хотите избежать этого, попробуйте:
(?:^|\s)(?:(?:(0?[1-9]|[1-2][0-9]|30|31)-(0?[13578]|10|12))|(?:(0?[1-9]|[1-2][0-9]|30)-(0?[469]|11))|(?:(0?[1-9]|[1-2][0-9])-(0?2)))-((?:20)?[0-9][0-9])(?:\s|$)
Кроме того, я предполагал, что перед датами будет стоять пробел (или начало / конец строки), но вы можете отрегулировать его (например, для пунктуации).
Комментатор в другом месте ссылался на этот ресурс, который может оказаться полезным:
http://rubular.com/