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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск слова в тексте, проверка значения 
V
    Опции темы
trinitr0
  Дата 13.11.2015, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте!

Есть задача найти определённое место в текстовом файле, 
начинающийся со строки, например "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";
        }


вообще ничего... 
PM MAIL Jabber   Вверх
igorold
Дата 13.11.2015, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



\[A-Z0-9]

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
trinitr0
Дата 13.11.2015, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Поправил:
Код

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


Но проблема с остатком текста после искомой строки осталась  smile 
PM MAIL Jabber   Вверх
igorold
Дата 13.11.2015, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



Неплохо бы больше програмного кода увидеть ...

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
noize
Дата 14.11.2015, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


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

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



Код

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

Код

% Value : A1

PM MAIL   Вверх
tzirechnoy
Дата 14.11.2015, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



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


Что логично -- поскольку если match failed, то переменная $1 не меняется, поскольку первое подвыражэние ничему не соответствует.
PM MAIL   Вверх
trinitr0
Дата 16.11.2015, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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

Добавлено через 6 минут и 18 секунд
Подскажите пожалуйста как поправить выражение, что бы оно давало только одну строку из текста при совпадении с шаблоном?
PM MAIL Jabber   Вверх
tzirechnoy
Дата 16.11.2015, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Никак -- приведённое регулярное выражэние итак выдаёт только одну строку текста при совпадении с шаблогом.
PM MAIL   Вверх
trinitr0
  Дата 16.11.2015, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В случае: 

Код

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);



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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



PS То есть проблема у Вас совсем не в регулярном выражэнии.
PM MAIL   Вверх
trinitr0
Дата 16.11.2015, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Честно говоря не могу сказать наверняка. 

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

PM MAIL Jabber   Вверх
tzirechnoy
Дата 16.11.2015, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

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



Цитата
Честно говоря не могу сказать наверняка. 


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


Шустрый
*


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

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



Вообщем решением было:

Код

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);

PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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