Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с простейшим приведением формата времени :) 
:(
    Опции темы
Ptr73
  Дата 5.2.2010, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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)

Заранее благодарен!
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.2.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



у вас вроде и так в виде чч:мм:сс

на perl - это можно сделать в одну регулярку.

на VB - скорее всего нет. Обратитесь лучше на форум по VB.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ptr73
Дата 5.2.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



ну так я эту перловую регулярку и прошу smile

прикрутить ее в 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
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.2.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Я вас предупреждал  =)
Код

s/([0-2]?[0-9]|):?([0-5]?[0-9]):([0-5][0-9]|)?/ ($1 || '00') . ':' . $2 . ':' . ($3 || '00')/eg;

Дерзайте.


А лучше не мучайтесь - напишите цикл.
На VB - это лучший способ решить эту проблему


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ptr73
  Дата 5.2.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



sir_nuf_nuf, во, спасибо! Это примерно то, что мне нужно!
Пошел прикручивать...

а циклом - не интересно, давно хотел себя заставить начать регулярки осваивать smile

Это сообщение отредактировал(а) Ptr73 - 5.2.2010, 11:32
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.2.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Если все таки прикрутите - пришлите код на VB.

Хочу заметить , что в этой регулярке используется модификатор e который по-моему есть только в perl


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ptr73
Дата 5.2.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



Я не знаю, что за модификатор e.
Вот у меня вопрос по приведению к форматам.
Если $2 отсутствует, то он заменяется на 00, а если он скажем ='2', нужно, чтобы он заменился на '02'
как это сделать в шаблоне замены?

может через какой 0+ или 0?

Это сообщение отредактировал(а) Ptr73 - 5.2.2010, 11:46
PM MAIL   Вверх
sir_nuf_nuf
Дата 5.2.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Код

s/([0-2]?[0-9]|):?([0-5]?[0-9]):([0-5][0-9]|)?/ sprintf("%02d:%02d:%02d", ($1 || 0), $2, ($3 || 0))/eg;


Модификатор e - это исполнение PERL кода


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ptr73
  Дата 5.2.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



Сделал, хотя и не настолько красиво, насколько рассчитывал.
К сожалению, без цикла не обошлось.

Это выражение
Код

([0-2]?[0-9]|):?([0-5]?[0-9]):([0-5][0-9]|)

в VB некорректно отрабатывает значения вида 12:34, преобразовывая их в 1:2:34

поэтому сделал примерно так:
Код

timestr = "1:10:50 1:28 13:41 14:23:10 2:12 1:44"
regex.Pattern = "(?:(\d)?(\d):)?(\d)?(\d):(\d+)"

Set matches = regex.Execute(timestr)

For i = 0 To matches.Count - 1

        timeline = timeline + CStr(Int(matches(i).SubMatches(0))) + CStr(Int(matches(i).SubMatches(1))) + ":" + CStr(Int(matches(i).SubMatches(2))) + CStr(Int(matches(i).SubMatches(3))) + ":" + CStr(Int(matches(i).SubMatches(4))) + "; "

Next i 

PM MAIL   Вверх
sir_nuf_nuf
Дата 5.2.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



ну, зато сделали.
проблема даже не в этом.
проблема в том, что вам нужно принимать решение в зависимости от того 
нашлось что - то в первой группе или нет.
в perl - это можно сделать с помощью регулярок.
в VB - нет.
Так что цикл вам в любом случае бы пришлось писать.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ptr73
Дата 5.2.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 альтернативы не сработали
ну да ладно, в будущем может удастся решить этот вопрос :)
PM MAIL   Вверх
sir_nuf_nuf
Дата 7.2.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Ptr73, я тут подумал - действительно можно =)
нужно просто применить несколько регулярок последовательно
что то вроде этого. Если аккуратно написать - будет понятнее чем с циклом. такие регулярки в VB точно есть
Код

$str =~ s/\b(\d:\d{2}:\d{2})\b/0$1/g;
$str =~ s/\b(\d{2}:\d{2})\b/00:$1/g;
$str =~ s/\b(\d:\d{2})\b/00:0$1/g;


Это сообщение отредактировал(а) sir_nuf_nuf - 7.2.2010, 11:10


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Logo
Дата 7.2.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата(sir_nuf_nuf @ 5.2.2010,  11:36)
Хочу заметить , что в этой регулярке используется модификатор e который по-моему есть только в perl

Такой модификатор (или вызов callback функции, что суть одно и тоже) вроде есть во всех языках. В PHP PCRE точно есть. В JavaScript тоже.
PM MAIL   Вверх
Ptr73
Дата 7.2.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Logo
Дата 8.2.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



http://wdh.suncloud.ru/js09.htm#mreplace
Цитата

Синтаксис: объект.replace(регвыр,строка)
           объект.replace(регвыр,функция)


По возможностям вызов функции - тоже самое код на месте с модификатором e. Удобство разное - код с модификатором e удобнее, если что-то простенькое обработать, функция - при большом коде.

Добавлено через 2 минуты и 59 секунд
В Perl, кстате, тоже можно вызвать функцию - записав ее в строке замены с  модификатором e. Переменные рег выражений глобальные, в функции будут доступны по умолчанию.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.