![]() |
|
Модераторы: ginnie |
![]()
|
|
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
Приветствую!
В регулярных выражениях я полный нуб, так что прошу элементарной помощи. Нужно распарсить строку с временами и привести ее к формату "чч:мм:сс" Строка наподобие такой: timestr="1:10:50 1:28 13:41 14:23:10 2:12 1:44" нужно получить список значений 01:10:50; 00:01:28; 00:13:41; 14:23:10; любыми методами, но предпочтительно если стандартными методами регулярных выражений и замены по шаблону, т.к. делаю я это на VBA через regexp и regexp.replace :) Примерно так: паттерн для поиска времён regex.Pattern = "([0-2]?[0-9])?:?([0-5]?[0-9]):([0-5][0-9])?" a какой паттерн использовать для replace - ума не приложу endstr = regEx.Replace(timestr, patrnreplace) Заранее благодарен! |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
у вас вроде и так в виде чч:мм:сс
на perl - это можно сделать в одну регулярку. на VB - скорее всего нет. Обратитесь лучше на форум по VB. |
|||
|
||||
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
ну так я эту перловую регулярку и прошу
прикрутить ее в VB - это уже моя задача хотя бы просто преобразовать строку "1:10:50 1:28 13:41 14:23:10 2:12 1:44" в "01:10:50 00:01:28 00:13:41 14:23:10 ..." потому как VB выражения вида мм:сс понимает как чч:мм, от чего мне нужно уйти, явно преобразовав все времена к одному формату а на форумах VB гораздо меньше специалистов по регуляркам, чем на форумах perl и php Это сообщение отредактировал(а) Ptr73 - 5.2.2010, 11:08 |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
Я вас предупреждал =)
Дерзайте. А лучше не мучайтесь - напишите цикл. На VB - это лучший способ решить эту проблему |
|||
|
||||
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
sir_nuf_nuf, во, спасибо! Это примерно то, что мне нужно!
Пошел прикручивать... а циклом - не интересно, давно хотел себя заставить начать регулярки осваивать Это сообщение отредактировал(а) Ptr73 - 5.2.2010, 11:32 |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
Если все таки прикрутите - пришлите код на VB.
Хочу заметить , что в этой регулярке используется модификатор e который по-моему есть только в perl |
|||
|
||||
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
Я не знаю, что за модификатор e.
Вот у меня вопрос по приведению к форматам. Если $2 отсутствует, то он заменяется на 00, а если он скажем ='2', нужно, чтобы он заменился на '02' как это сделать в шаблоне замены? может через какой 0+ или 0? Это сообщение отредактировал(а) Ptr73 - 5.2.2010, 11:46 |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
Модификатор e - это исполнение PERL кода |
|||
|
||||
| Ptr73 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
Сделал, хотя и не настолько красиво, насколько рассчитывал.
К сожалению, без цикла не обошлось. Это выражение
в VB некорректно отрабатывает значения вида 12:34, преобразовывая их в 1:2:34 поэтому сделал примерно так:
|
||||
|
|||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
ну, зато сделали.
проблема даже не в этом. проблема в том, что вам нужно принимать решение в зависимости от того нашлось что - то в первой группе или нет. в perl - это можно сделать с помощью регулярок. в VB - нет. Так что цикл вам в любом случае бы пришлось писать. |
|||
|
||||
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
да я до сих пор верю, что и на регулярках VB это можно реализовать
вот если бы от цикла избавиться через Replace типа timeline = regex.Replace(timestr, "$1$2:$3$4:$5") Проблема в том, чтобы если $i пустые, то они заменялись бы на "0", а пока - только пустые строки вставляются вместо "00:01:28" получается ":1:28" нужно подобрать конструкцию наподобие timeline = regex.Replace(timestr, "$1|0$2|0:$3|0$4:$5") вот только у меня все эти |0, ||0, \|0 альтернативы не сработали ну да ладно, в будущем может удастся решить этот вопрос :) |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 1 Всего: 31 |
Ptr73, я тут подумал - действительно можно =)
нужно просто применить несколько регулярок последовательно что то вроде этого. Если аккуратно написать - будет понятнее чем с циклом. такие регулярки в VB точно есть
Это сообщение отредактировал(а) sir_nuf_nuf - 7.2.2010, 11:10 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
Такой модификатор (или вызов callback функции, что суть одно и тоже) вроде есть во всех языках. В PHP PCRE точно есть. В JavaScript тоже. |
|||
|
||||
| Ptr73 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.2.2010 Репутация: нет Всего: нет |
sir_nuf_nuf, спасибо, сейчас сделаю по подобию.
Возник такой вопрос - а можно ли сделать паттерн для выборки тех частей строки, которые не подпадают под шаблон? например, все кроме (\b\d{2}:\d{2}:\d{2}\b) ??? чтобы одним Replace() от мусора избавиться [тогда б теоретически вообще все в 2 строки б можно было б преобразовать, в первой реплэйсом накидываются лишние нули, во второй реплэйсом отсекается все лишнее] Logo, погуглил, вроде в PHP есть, а в JavaScript - не нашел. Можете ткнуть носом? Вот, что нашел по регуляркам MSDN регулярки в JavaScript MSDN регулярки в .Net Это сообщение отредактировал(а) Ptr73 - 7.2.2010, 18:34 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 5 Всего: 10 |
http://wdh.suncloud.ru/js09.htm#mreplace
По возможностям вызов функции - тоже самое код на месте с модификатором e. Удобство разное - код с модификатором e удобнее, если что-то простенькое обработать, функция - при большом коде. Добавлено через 2 минуты и 59 секунд В Perl, кстате, тоже можно вызвать функцию - записав ее в строке замены с модификатором e. Переменные рег выражений глобальные, в функции будут доступны по умолчанию. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |