Подберите части любой даты в любом месте строки, используя регулярное выражение - PullRequest
1 голос
/ 29 июля 2010

На это, вероятно, отвечали десятки раз, но не смог найти ответ ...

В любом случае, работая в среде Smalltalk, у меня есть строка, состоящая из трех частей, подобных этой: "ttm 4/6/97 00:08".Строка является очень переменной, что означает, что некоторая часть может отсутствовать (поэтому это будет строка, состоящая из менее чем трех частей, таких как "ttm 4/6/97"), и порядок может быть другим ("00:08 ttm 4/6/97").Также в дате могут отсутствовать цифры ("04/6/1997", "4/06/97" и т. Д.).К счастью, пробелы в качестве разделителей являются постоянными плюс, нет пробелов в начале и в конце.

Мне нужно найти дату в строке и сопоставить две части, например: (4/6/)(97).До сих пор у меня был успех для определенных комбинаций только с чем-то вроде этого:

^\S*\s?(\d\d?/\d\d?/)(\d\d\d?\d?)\s?\S*

Может ли кто-нибудь указать мне правильное направление?

Редактировать: чтобы упростить задачу, я попыталсячтобы получить совпадение для всей даты, используя следующее выражение: ^.*(\d\d?/\d\d?/\d\d\d?\d?).* (средство сопоставления ожидает, что выражение соответствует всей строке).Применительно к строке "10/4/97 00:08 di" возвращаемое совпадение равно "0/4/97" (возможно, сопоставление не является самым лучшим из когда-либо созданных ...).Может ли строка регулярного выражения каким-либо образом изменяться, чтобы гарантировать, что сопоставитель возвращает всю дату?(Спасибо SilentGhost за редактирование).

1 Ответ

2 голосов
/ 29 июля 2010

Кажется, вы пытаетесь сопоставить слишком много элементов. Если вам интересна только дата, почему бы не сделать следующее:

(\d{,2}/\d{,2}/)(\d{2,4})

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...