Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Шаблон для метасимволов


Автор: Marlik 21.5.2010, 19:00
Доброго всем. 

Есть строка ^-59869856jkjgspofijgjspogjr начинается с ^- как Вы заметили. 
Требуется вырезать цифры. Цифры вырезаю, но получается такой вариант: ^-59869856

 Как только не пробовал, первые два метасимвола никак не хотят выделяться

.+ - не работает
\W - не работает

уже как только не пробовал, может кто-то встречался с такой проблемой, спасибо.

Автор: Pfailed 22.5.2010, 12:01
Покажите как вырезаете то.

Автор: Marlik 22.5.2010, 15:34
Там на самом деле несколько строк, нужен вариант регекспа что-бы подошел ко всем,  это типа тестового задания, мне оно не надо но дело принципа:

Код


my $str = "^92(28/10/2002)**&[19:10:50]\@Comment: Text String";
my $str2 = "^-06/02/2002*$21:55:45";
my $str3 = "^*13/08/2002*DX145&[22:50:20]\@Comment: Text String";

$str =~ s/.+((\d){2}\/(\d){2}\/(\d){4}).+((\d+)\:(\d+)\:(\d+)).+(Comment:)(.+)/$1 - $5 - $+/i;



Вот второй вариант никак не решается, мозг сломал.

Автор: rumax 31.5.2010, 07:55
Цитата(Marlik @ 22.5.2010,  15:34)
Там на самом деле несколько строк, нужен вариант регекспа что-бы подошел ко всем,  это типа тестового задания, мне оно не надо но дело принципа:

Код


my $str = "^92(28/10/2002)**&[19:10:50]\@Comment: Text String";
my $str2 = "^-06/02/2002*$21:55:45";
my $str3 = "^*13/08/2002*DX145&[22:50:20]\@Comment: Text String";

$str =~ s/.+((\d){2}\/(\d){2}\/(\d){4}).+((\d+)\:(\d+)\:(\d+)).+(Comment:)(.+)/$1 - $5 - $+/i;



Вот второй вариант никак не решается, мозг сломал.

Решается довольно просто:
Код

my $pattern = '^.*(\d{2}\/\d{2}\/\d{4}).*(\d{2}:\d{2}:\d{2})[\].]*(?(?=@Comment: )@Comment: (.*))';
if ($txt =~ m/$pattern/) {
  my $date    = defined($1) ? $1 : "Unknown";
  my $time    = defined($2) ? $2 : "Unknown";
  my $comment = defined($3) ? $3 : "Unknown";
  p("date    = [".$date."]", 1);
  p("time    = [".$time."]", 1);
  p("comment = [".$comment."]", 1);
} else {
  p("No matches", 1);
}

 smile 

З.Ы. $txt - значение $str, $str2 или $str3

Автор: Marlik 9.6.2010, 19:38
Спасибо конечно, но у Вас также не работает патерн со строкой в этой переменной $str2...

Автор: rumax 10.6.2010, 08:09
Цитата(Marlik @ 9.6.2010,  19:38)
Спасибо конечно, но у Вас также не работает патерн со строкой в этой переменной $str2...

Действительно, странно. А вот если строку взять в одинарных кавычках, то работает.

ну или так переменные объявить
Код

my $str1 = "^92(28/10/2002)**&[19:10:50]\@Comment: Text String";
my $str2 = "^-06/02/2002*\$21:55:45";
my $str3 = "^*13/08/2002*DX145&[22:50:20]\@Comment: Text String";


Автор: dva300 12.6.2010, 14:37
Цитата(Marlik @ 22.5.2010,  15:34)
Там на самом деле несколько строк, нужен вариант регекспа что-бы подошел ко всем,  это типа тестового задания, мне оно не надо но дело принципа:


ели я правильно понял то нужно вытащить дату и время ?

тогда так

Код

use strict;
my $str = "^92(28/10/2002)**&[19:10:50]\@Comment: Text String";
my $str2 = "^-06/02/2002*&21:55:45";
my $str3 = "^*13/08/2002*DX145&[22:50:20]\@Comment: Text String";

if ($str3 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?/)
    {
    print "$1 , $2"; 
    }

Автор: Marlik 12.6.2010, 19:38
Да, поняли почти правильно, дату, время, и все что после Comment:. но все равно если

Код

if ($str2 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?/)
    {
    print "$1 , $2"; 
    }


то результат тот-же, никакой. Нужно найти регэксп который подойдет для всех трех вариантов. Но все равно спасибо, за участие.

Автор: dva300 13.6.2010, 13:07
Цитата(Marlik @ 12.6.2010,  19:38)
Да, поняли почти правильно, дату, время, и все что после Comment:. но все равно если

Код

if ($str2 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?/)
    {
    print "$1 , $2"; 
    }


то результат тот-же, никакой. Нужно найти регэксп который подойдет для всех трех вариантов. Но все равно спасибо, за участие.

хм... проверил еще раз... у меня работает без проблем. добавил чтобы еще и после Comment выбирал 
выполняет нормально и для переменных и если из файла читать.

рассказывайте тогда полностью процедуру как делаете. может у вас строки все же другие ?

Код

use strict;
print "...from vars...\n";
my $str1 = "^92(28/10/2002)**&[19:10:50]\@Comment: Text String str1";
my $str2 = "^-06/02/2002*&21:55:45";
my $str3 = "^*13/08/2002*DX145&[22:50:20]\@Comment: Text String str3";

if ($str1 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?(.*Comment:)?(.*)/)
    {
    print "$1 , $2 ,$4\n"; 
    }
if ($str2 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?(.*Comment:)?(.*)/)
    {
    print "$1 , $2 ,$4\n"; 
    }
if ($str3 =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?(.*Comment:)?(.*)/)
    {
    print "$1 , $2 ,$4\n";
    }    
    
print "...from file...\n";
open(FF,"for_fact.txt") or die "$! : Error";
while(<FF>)
    {
    if ($_ =~ /\(?(\d{2}\/\d{2}\/\d{4})\)?.+\[?(\d{2}:\d{2}:\d{2})\]?(.*Comment:)?(.*)/)
        {
        print "$1 , $2 ,$4\n"; 
        }
    }
close(FF);    



вывод следующий 

Код

...from vars...
28/10/2002 , 19:10:50 , Text String str1
06/02/2002 , 21:55:45 ,
13/08/2002 , 22:50:20 , Text String str3
...from file...
28/10/2002 , 19:10:50 , Text String str1
06/02/2002 , 21:55:45 ,
13/08/2002 , 22:50:20 , Text String str3

Автор: Marlik 14.6.2010, 08:36
У Вас ошибка со второй переменной $str2, Вы знак доллара - $ заменили амперсандом - &

Мой вариант: my $str2 = "^-06/02/2002*$21:55:45";
Ваш вариант: my $str2 = "^-06/02/2002*&21:55:45";

Поэтому и не работает у меня, спасибо.

Автор: dva300 14.6.2010, 13:56
Цитата(Marlik @ 14.6.2010,  08:36)
У Вас ошибка со второй переменной $str2, Вы знак доллара - $ заменили амперсандом - &

Мой вариант: my $str2 = "^-06/02/2002*$21:55:45";
Ваш вариант: my $str2 = "^-06/02/2002*&21:55:45";

Поэтому и не работает у меня, спасибо.

хм... действительно аномалия какая-то  smile 
но суть от этого не меняется при инициализации переменных используйте '' (апострофы) а не "" (кавычки)
с файлом работает и так.


Автор: rumax 14.6.2010, 14:24
Цитата(dva300 @ 14.6.2010,  13:56)
Цитата(Marlik @ 14.6.2010,  08:36)
У Вас ошибка со второй переменной $str2, Вы знак доллара - $ заменили амперсандом - &

Мой вариант: my $str2 = "^-06/02/2002*$21:55:45";
Ваш вариант: my $str2 = "^-06/02/2002*&21:55:45";

Поэтому и не работает у меня, спасибо.

хм... действительно аномалия какая-то  smile 
но суть от этого не меняется при инициализации переменных используйте '' (апострофы) а не "" (кавычки)
с файлом работает и так.

С апострофами и мой код работает. А если кавычки использовать, то будет ругаться на переменные необъявленные

Автор: dva300 14.6.2010, 14:43
Цитата(rumax @ 14.6.2010,  14:24)
Цитата(dva300 @ 14.6.2010,  13:56)
Цитата(Marlik @ 14.6.2010,  08:36)
У Вас ошибка со второй переменной $str2, Вы знак доллара - $ заменили амперсандом - &

Мой вариант: my $str2 = "^-06/02/2002*$21:55:45";
Ваш вариант: my $str2 = "^-06/02/2002*&21:55:45";

Поэтому и не работает у меня, спасибо.

хм... действительно аномалия какая-то  smile 
но суть от этого не меняется при инициализации переменных используйте '' (апострофы) а не "" (кавычки)
с файлом работает и так.

С апострофами и мой код работает. А если кавычки использовать, то будет ругаться на переменные необъявленные

я что-то не пойму. не хотите апострофы использовать тогда экранируйте символ $ через \$ в ручную.

или это задача на выносливость мозга ? 

Автор: Marlik 14.6.2010, 16:23
Нельзя менять, кавычки на апострофы, и не нужно читать из файла. Есть эти три строки, и надо придумать один регэксп для всех трех. Я так понимаю что в строках, использованы метасимволы, их надо как-то обойти.

Меня интересует такая инструкция: 

\Q - Вплоть до команды \E все последующие метасимволы становятся обычными символами...

А вот как это применить не пробовал, и не знаю...

Автор: dva300 14.6.2010, 17:03
Цитата(Marlik @ 14.6.2010,  16:23)
Нельзя менять, кавычки на апострофы, и не нужно читать из файла. Есть эти три строки, и надо придумать один регэксп для всех трех. Я так понимаю что в строках, использованы метасимволы, их надо как-то обойти.

Меня интересует такая инструкция: 

\Q - Вплоть до команды \E все последующие метасимволы становятся обычными символами...

А вот как это применить не пробовал, и не знаю...

я когда был маленький то работал у одного из провайдеров админом. так там наш главный админ при приеме на работу новеньких давал им задачу следующего характера - "дается заведомо не рабочий модем с каким-либо дефектом и ставилась задача завести его в модемный пул."  сколько мы тогда гипотез наслушались..... 

Автор: Marlik 14.6.2010, 19:20
Это всего лишь строка, думаю вариант с апострофами самый оптимальный, что-бы мозг не вынести...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)