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


Автор: trinitr0 13.11.2015, 11:06
Здравствуйте!

Есть задача найти определённое место в текстовом файле, 
начинающийся со строки, например "Value", и проверить значение 
стоящие после двоеточия и вывести строку в случае соответствия значению "A1".

Если пробую так:

Код

$line =~ /^\bValue\b\s+:\s+(A1)$/;
        if ($1 eq A1)
        {
            print "$line \n";
        }


То выводится весь остаток текста после искомой строки,
начиная с икомой.

Если так:

Код

$line =~ /^\bValue\b\s+:\s+(\[A-Z0-9]+)$/;
        if ($1 eq A1)
        {
            print "$line \n";
        }


вообще ничего... 

Автор: igorold 13.11.2015, 12:25
\[A-Z0-9]

зачем слэш перед квадратной скобкой? этим вы сломали шаблон

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/poisk-slova-v-tekste-id56459a9fae2015cd6d8b4567#findElement_E7045_5645aca5ae2015830e8b483e_0

Автор: trinitr0 13.11.2015, 14:09
Поправил:
Код

$line =~ /^\bValue\b\s+:\s+([A-Z0-9]+)$/;
        if ($1 eq A1)
        {
            print "$line \n";
        }


Но проблема с остатком текста после искомой строки осталась  smile 

Автор: igorold 13.11.2015, 20:13
Неплохо бы больше програмного кода увидеть ...

И что такое А1?
может $A1 или 'A1' ?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/poisk-slova-v-tekste-id56459a9fae2015cd6d8b4567#findElement_E7045_56461a32ae2015c77c8b4ee3_0

Автор: noize 14.11.2015, 01:27
Код

my $str = "Value : A1";
say $str if $str =~ m/^Value\s:\sA1$/;

Код

% Value : A1

Автор: tzirechnoy 14.11.2015, 16:36
Цитата
То выводится весь остаток текста после искомой строки,


Что логично -- поскольку если match failed, то переменная $1 не меняется, поскольку первое подвыражэние ничему не соответствует.

Автор: trinitr0 16.11.2015, 13:00
Цитата(tzirechnoy @ 14.11.2015,  16:36)
Цитата
То выводится весь остаток текста после искомой строки,


Что логично -- поскольку если match failed, то переменная $1 не меняется, поскольку первое подвыражэние ничему не соответствует.

Не совсем понял что Вы хотели сказать.

Добавлено через 6 минут и 18 секунд
Подскажите пожалуйста как поправить выражение, что бы оно давало только одну строку из текста при совпадении с шаблоном?

Автор: tzirechnoy 16.11.2015, 14:59
Никак -- приведённое регулярное выражэние итак выдаёт только одну строку текста при совпадении с шаблогом.

Автор: trinitr0 16.11.2015, 15:12
В случае: 

Код

my $filename = "/text.txt";
while (<F1>)
{
    print if m/Value/;
}
close F1;


да действительно, одна строка.

Но мне надо для такого случая:
(извеняюсь, надо было сразу весь тескт приводить, но неопытности решил что будет достаточно
пары строк)

Код

open(F1, "/text.txt");
my @raw=<F1>; 
chomp (@raw);
foreach $line (@raw)
{    

    $line =~ m/^\bValue\b\s+:\s+([A-Z0-9]+)$/o;
    if ($1 eq A1)
    {
        print "$line \n";
    }
    
}
close(F1);



Автор: tzirechnoy 16.11.2015, 16:14
PS То есть проблема у Вас совсем не в регулярном выражэнии.

Автор: trinitr0 16.11.2015, 16:39
Честно говоря не могу сказать наверняка. 

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

Автор: tzirechnoy 16.11.2015, 20:57
Цитата
Честно говоря не могу сказать наверняка. 


Зато я говорю вполне наверняка.

Автор: trinitr0 18.11.2015, 14:08
Вообщем решением было:

Код

open( F1, "text.txt" );
my @raw = <F1>;
chomp (@raw);
foreach my $line (@raw) {
    my ($val) = $line =~ m/^\bValue\b\s+:\s+([A-Z0-9]+)$/o;
    next unless $val;
    if ( $val eq "A1"  ) {
        print "$line \n";
    }

}
close(F1);

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