Автор Тема: Немного глючит регулярное  (Прочитано 5433 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« : 02 Августа 2004, 17:28:19 »
Доброе!
$strout = \'TEXTBEGIN01.02.03\\N04:05:06TEXTEND\';

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';
$i = \'1\';

$strout =~ s/$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5]/print"$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5].";printf \'<%02s>\', $i++;print "   test";/ge;


Почему-то получается "01.02.03\\N04:05:06.<01>   testTEXTBEGIN1TEXTEND". То есть не тот порядок, который хотелось бы увидеть. Где грабли?
WBR, GrAfF.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немного глючит регулярное
« Ответ #1 : 02 Августа 2004, 17:46:10 »
что хотелось бы увидеть?
And no religion too...

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #2 : 02 Августа 2004, 17:59:38 »
TEXTBEGIN01.02.03N04:05:06.<01> testTEXTEND - получается
01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND - нужно.
Почему при /e и разном коде замены в результате работы выражения куски текста меняются местами? Долго переписывал, пробовал разные варианты. Заметил, ещё единица откуда-то в "BEGIN1TEXT".
WBR, GrAfF.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немного глючит регулярное
« Ответ #3 : 02 Августа 2004, 18:05:13 »
ИХМО... регеплексы медленные... и использовать я бы их порекомендовал в крайнем случае... :
как вариант. (посмотри внимательно datetime отделены чем либо от текста? например пробелами...):
$strout = \'TEXTBEGIN 01.02.03N04:05:06 TEXTEND\';

($text_begin, $time, $text_end)=split(" ", $strout);
($time, $date) = split("N", $time);

print "time: $time\\n date: $date\\n text_begin: $text_begin\\n text_end: $text_end\\n";
And no religion too...

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #4 : 02 Августа 2004, 18:06:24 »
Цитировать
GrAfF:
Почему-то получается "01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND". То есть не тот порядок, который хотелось бы увидеть. Где грабли?

Цитировать
GrAfF:
TEXTBEGIN01.02.03N04:05:06.<01> testTEXTEND - получается
01.02.03\\N04:05:06.<01> testTEXTBEGIN1TEXTEND - нужно


Ты все-таки определись, что тебе нужно... ;)
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немного глючит регулярное
« Ответ #5 : 02 Августа 2004, 18:12:56 »
Если я правильно понял... то можно так:
#!/usr/bin/perl -w

$strout = \'TEXTBEGIN01.02.03N04:05:06TEXTEND\';

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';

$datetime="$dig[0].$dig[1].$dig[2]N$dig[3]:$dig[4]:$dig[5]";
($text_begin, $text_end)=split($datetime, $strout);

print "datetime: $datetime\\n text_begin:$text_begin \\n text_end: $text_end";
And no religion too...

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #6 : 02 Августа 2004, 18:26:40 »
Mike, точно, я перепутал. Слова "нужно" и "получается" нужно переставить местами. Получается. ;)

commander, интересный вариант, я подумаю. Хотя сложность и медленность регов не пугает.
Есть огромный файл. Нужно в нем найти кусочек, совпадающий с числами из @dig и ко всем совпадениям дописать число, увеличивающиеся на единицу.
Мне как-то проще и интереснее отдать его на растерзание регэкспам, чем писать много всяких циклов.
Нужные числа (@dig) тоже находится регэкспом. Тогда должен бы срабатывать этот. Но он почему-то не хочет.
WBR, GrAfF.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немного глючит регулярное
« Ответ #7 : 02 Августа 2004, 18:33:29 »
GrAfF
Цитировать
Есть огромный файл.

тем более не рекомендую регэксы...
And no religion too...

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #8 : 02 Августа 2004, 18:53:02 »
commander, больше в том смысле, что мусора там много. Работает всё равно быстро. Мне проще и интереснее через рег... Единственная проблема - не пойму как написать правильно этот кусок кода.
WBR, GrAfF.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Немного глючит регулярное
« Ответ #9 : 02 Августа 2004, 19:15:03 »
Если файл строкоориентирован и в строке искомое встречается только раз то:

my @dig;

$dig[0] = \'01\';
$dig[1] = \'02\';
$dig[2] = \'03\';
$dig[3] = \'04\';
$dig[4] = \'05\';
$dig[5] = \'06\';
my $i = \'1\';

my $str = join( ".", @dig[0..2] ) . \'N\' . join( ":", @dig[3..5] );

while ( ) {
        substr( $_, index( $_, $str ), length($str) ) = $str.\'.<\'.$i++.\'>\';
        print;
}

__DATA__
TEXTBEGIN01.02.03N04:05:06TEXTEND
TEXTBEGIN01.02.03N04:05:06TEXTEND

иначе нужно код не много усложнить.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #10 : 04 Августа 2004, 21:01:21 »
Спасибо за советы. Возможно, напишу в таком духе, без рег. Но основной вопрос остался чуть нераскрытым - как правильно написать код замены в регэкспе, чтобы результат был более похож на нужный?
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного глючит регулярное
« Ответ #11 : 04 Августа 2004, 21:45:27 »
Заработало вот так:
$strout =~ s/$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5]/"$dig[0].$dig[1].$dig[2]\\\\N$dig[3]:$dig[4]:$dig[5].".ttt().$comment/ge;

sub ttt{
my $aa = sprintf (\'%02s\', $i++);
return $aa;
}

Почему?
WBR, GrAfF.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28